總結——關於2017 10 9測試的分析總結

来源:互联网 发布:java private的作用 编辑:程序博客网 时间:2024/05/16 01:46

NOIP 2017 模拟


2017 10 9



T1 :


题目:

AHOI 2003








显而易见这是一道简单的字符串处理题。

毫无悬念的Ac。


代码:

#include<string>#include<cstdio>#include<map>#define pow4(x) x*x*x*xusing namespace std;int n,t;map <string,int> m;inline bool get(){char c=getchar();while((c<'a'||c>'z')&&(c<'A'||c>'Z')) if((c=getchar())==EOF) return false;string s="";while((c>='a'&&c<='z')||(c>='A'&&c<='Z')){if(c>='A'&&c<='Z') c=c-'A'+'a';s+=c;c=getchar();}++m[s];++n;return true;}int main(){while(get());for(map <string,int> :: iterator it=m.begin();it!=m.end();++it) t+=pow4(it->second);printf("%d %d\n",t,n);return 0;}





T2 : 


题目:





好吧,我承认我脑洞太大,太神化出题人了。。。。。。



正解:


varn, i, j, l, r, x, si, fj, ti, tj ,ans : longint;t, s, f : array [0..1001] of longint;function max (a, b : longint) : longint;begin        if a > b then exit (a)        else exit (b);end;function min (a, b : longint) : longint;begin        if a > b then exit (b)        else exit (a);end;begin        read (n);        for i := 1 to n do read (t[i], s[i], f[i]);        for i := 1 to n do begin                ans := 0;                for j := 1 to n do                        if i <> j then begin                                if (s[i] < f[i]) and (s[j] < f[j]) then begin                                        l := max (s[i], s[j]);                                        r := min (f[i], f[j]);                                        if l > r then continue;                                        if t[i] - s[i] = t[j] - s[j] then inc (ans);                                end                                else if (s[i] > f[i]) and (s[j] > f[j]) then begin                                        l := min (s[i], s[j]);                                        r := max (f[i], f[j]);                                        if l < r then continue;                                        if s[i] + t[i] = s[j] + t[j] then inc (ans);                                end                                else begin                                        if s[i] < f[i] then begin                                                si := s[i];                                                ti := t[i];                                                fj := s[j];                                                tj := t[j];                                                l := max (s[i], f[j]);                                                r := min (f[i], s[j]);                                        end                                        else begin                                                si := s[j];                                                ti := t[j];                                                fj := s[i];                                                tj := t[i];                                                l := max (s[j], f[i]);                                                r := min (f[j], s[i]);                                        end;                                        if l > r then continue;                                        x := tj - ti + si + fj;                                        if (x >= l * 2) and (x <= r * 2) then inc(ans);                                end;                        end;                write (ans, ' ');        end;end.






T3 : 


题目:





题解找不到了,那就水一发吧。。。


#include<cstdio>#include<algorithm>#define lowbit(i) i&-i#define add(a) for(;a.orz<=200001;a.orz+=lowbit(a.orz)) sum[a.orz]+=a.num,++day[a.orz]#define want(a) int x=0; for(;i;i-=lowbit(i)) x+=a[i]; return xstruct node{int num,orz;inline bool operator < (const node &a) const{return num>a.num;};}t[200010],d[200010];int n,m;int r[200010],day[200010],ans[200010],sum[200010];inline int read(){int i=0;char c=getchar();while(c<'0'||c>'9') c=getchar();while(c>='0'&&c<='9') i=(i<<3)+(i<<1)+c-48,c=getchar();return i;}inline void write(int x){short sum=0;char c[10];do c[++sum]=x%10+48,x/=10; while(x);while(sum) putchar(c[sum--]);putchar(' ');}inline int qsum(int i) {want(sum);}inline int qday(int i) {want(day);}int main() {n=read();m=read();for(int i=1;i<=m;++i) t[i].num=read(),t[i].orz=i;for(int i=1;i<=n;++i) d[i].num=read(),r[i]=read(),d[i].orz=i;std::sort(t+1,t+m+1);std::sort(d+1,d+n+1);for(int i=1,head=1;i<=n;++i) {while(t[head].num>d[i].num&&head<=m) {add(t[head]);++head;}int _l=0,_r=m+1;while(_l+1<_r) {int mid=_l+_r>>1;qsum(mid)-qday(mid)*d[i].num>=r[d[i].orz] ? _r=mid : _l=mid;}ans[d[i].orz]=_l==m ? 0 : _r;}for(int i=1;i<=n;++i) write(ans[i]);return 0;}



原创粉丝点击