codeforce 224
好久没写csdn的博客了,自从今年的亚洲赛完就一直没有敲过有关算法方面的程序,发现现在都有点生疏了。昨天参加了场CF,惨败。。。
第一题,水贪心,没仔细读题,结果当成是博弈DP,敲完果断贡献了个WA。
第二题,水题,把数存数组里排序,左右扫一遍就OK了。
第三题,一直题意没弄明白,后来问了学妹题意,是个递归二分,开始敲代码,还算比较顺利,结果MLE了,数爆int了,结果就跪了。后来改long long 果断过了。
第四题,没看。
第五题,感觉是离线数据结构查询,不过没想太明白也没太多时间就没动,今天看了下,完全是可以做的。
开始没多久,中途断网近半小时,顿时好无语,加上不熟,果断时间不够,给跪了。
第三题,代码
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <map> #define LL long long using namespace std; const int mm = 1e5+9; //map<LL,LL>mp; class ppp { public: LL l,r; LL typ; LL a,b; }f[mm]; int n; LL query(LL x) { LL l = 0,r = n-1,mid; while(l<=r) { mid = (l+r)/2; if(f[mid].l<=x && f[mid].r>=x) { if(f[mid].typ == 1) return f[mid].a;//mp[x]; else { int num = x-f[mid].l+1; num = num%f[mid].a; if(num == 0) num = f[mid].a; return query(num); } } else if(f[mid].l>x) { r = mid -1; } else if(f[mid].r<x) { l = mid + 1; } } } int main() { while(~scanf("%d",&n)) { // mp.clear(); LL kai = 1; for(int i=0;i<n;++i) { int typ,a,b; scanf("%d",&typ); if(typ == 1) { scanf("%d",&a); f[i].l = kai; f[i].r = kai; f[i].a = a; f[i].typ = typ; // mp[kai] = a; ++kai; } else { scanf("%d%d",&a,&b); f[i].l = kai; f[i].r = kai + (LL)a*b-1; kai = f[i].r + 1; f[i].typ = typ; f[i].a = a; f[i].b = b; } } // for(int i=0;i<n;++i) // { // printf("%d %d %d %d\n",f[i].l,f[i].r,f[i].a,f[i].b); // } int m; LL qu; scanf("%d",&m); for(int i=0;i<m;++i) { scanf("%I64d",&qu); printf("%I64d ",query(qu)); } printf("\n"); } return 0; }
第四题
#include <iostream> #include <cstdio> #include <set> #include <cstring> #include <map> #include <string> #include <vector> #include <algorithm> #include <cmath> #include <queue> #define VI vector<int> #define PB push_back #define ll(x) (1<<x) #define FOR(i,a,b) for(int i=a;i<=b;++i) #define DWN(i,a,b) for(int i=a;i>=b;--i) #define clr(f,z) memset(f,z,sizeof(f)) using namespace std; const int mm = 7009; int d[mm*311],l[mm],r[mm],x[mm],vis[mm*311]; VI level[mm]; int main() { d[0] = 0; FOR(i,1,111*mm-1)///i 对应右下一层的值 { d[i] = d[i-1] + 1; if( (i&(i-1)) == 0) ++d[i]; } int n,m; while(cin>>n>>m) { int res = 0,typ,id; clr(vis,0); FOR(i,0,mm-1) level[i].clear(); FOR(i,1,m) { cin>>typ; if(typ == 1) { cin>>id>>l[i]>>r[i]>>x[i]; level[id].PB(i); } else { int t,v,ll,rr,ans; cin>>t>>v; // puts("uuu"); ++res; ans = 0; ll = rr = v; FOR(j,t,n) { int len = level[j].size()-1; // FOR(k,0,level[j].size()-1) //BUG FOR(k,0,len) if(ll>r[ level[j][k] ] || rr < l[ level[j][k] ]) continue; else { if(vis[ x[ level[j][k] ] ] != res) { vis[ x[ level[j][k] ] ] = res; ++ans; } } ll = d[ll-1] + 1; rr = d[rr]; } cout<<ans<<endl; } } } return 0; } /** 4 5 1 4 4 7 1 1 3 1 2 2 2 1 1 2 4 1 2 3 3 */
第五题:
//在线线段树 265 MS #include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<queue> #include<set> #include<vector> #include<string> #include<algorithm> #define lson (t<<1) #define rson (t<<1|1) #define FOR(i,a,b) for(int i=a;i<=b;++i) #define DWN(i,a,b) for(int i=a;i>=b;--i) #define clr(f,z) memset(f,z,sizeof(f)) #define ll(x) (1<<x) using namespace std; const int mm = 1e6+9; char bracket[mm]; class Segment { public: int l,r,len,lbracket,rbracket; }rt[mm*4]; void push(int t) { int num = min(rt[lson].lbracket,rt[rson].rbracket); rt[t].len = rt[lson].len + rt[rson].len + num; rt[t].lbracket = rt[lson].lbracket + rt[rson].lbracket - num; rt[t].rbracket = rt[lson].rbracket + rt[rson].rbracket - num; } void build(int t,int l,int r) { rt[t].l = l; rt[t].r = r; if(l == r) { rt[t].len = 0; rt[t].lbracket = rt[t].rbracket = 0; if(bracket[l-1] == '(') rt[t].lbracket++; else rt[t].rbracket++; return ; } int mid = (l+r)/2; build(lson,l,mid); build(rson,mid+1,r); push(t); } Segment query(int t,int l,int r) { if(rt[t].l >= l && rt[t].r <= r) { return rt[t]; } Segment ret = rt[t]; ret.lbracket = 0; ret.rbracket = 0; ret.len = 0; if(rt[t].r < l || rt[t].l > r) return ret; else { Segment la = query(lson,l,r); Segment ra = query(rson,l,r); int num = min(la.lbracket,ra.rbracket); ret.len = la.len + ra.len + num; ret.lbracket = la.lbracket + ra.lbracket - num; ret.rbracket = la.rbracket + ra.rbracket - num; return ret; } } int main() { while(~scanf("%s",bracket)) { int len = strlen(bracket); build(1,1,len); int m,a,b; scanf("%d",&m); FOR(i,1,m) { scanf("%d%d",&a,&b); printf("%d\n",query(1,a,b).len*2); } } return 0; } /////右离线版 93MS //#include<cstdio> //#include<cstring> //#include<iostream> //#include<cmath> //#include<queue> //#include<set> //#include<vector> //#include<string> //#include<stack> //#include<algorithm> //#define PII pair<int,int> //#define FOR(i,a,b) for(int i=a;i<=b;++i) //#define DWN(i,a,b) for(int i=a;i>=b;--i) //#define clr(f,z) memset(f,z,sizeof(f)) //#define ll(x) (1<<x) // //using namespace std; //const int mm = 1e6+9; //char bracket[mm]; //int sum[mm]; // //int lowbit(const int x) //{ // return x&(-x); //} // //void add(int*sum,int pos,const int num) //{ // for(int i=pos;i<mm;i+=lowbit(i)) // { // sum[i] += num; // } //} // //int query(int*sum,const int pos) //{ // int ans = 0; // for(int i=pos;i>0;i-=lowbit(i)) // ans += sum[i]; // return ans; //} //stack<int>st; //vector<PII>q[mm]; //int ans[mm]; //int main() //{ // // while(~scanf("%s",bracket)) // { // int m,a,b; // scanf("%d",&m); // FOR(i,1,m) // { // scanf("%d%d",&a,&b); // --a; --b; // q[a].push_back(PII(b,i)); // } // int len = strlen(bracket); // clr(sum,0); // DWN(i,len-1,0) // { // if(bracket[i] == ')') // st.push(i); // else // { // if(!st.empty()) // { // add(sum,st.top(),1); // st.pop(); // } // } // for(int j = 0;j<q[i].size();++j) // { // ans[ q[i][j].second ] = query(sum,q[i][j].first); // } // } // FOR(i,1,m) // printf("%d\n",ans[i]+ans[i]); // } // return 0; //}
The article write by nealgavin