杭州邀请赛再现~~~
总结:1、实力弱成渣,2、配合还不够~~3、水题正确率不够高~~
A:概率水题~~~暴力搞搞~~(队友看完没有想法,当时正在想B,就木有去看~~后来队友说了下题意,感觉纯暴力就能裸过~~)
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <climits> #include <cctype> #include <ctime> #include <algorithm> #include <iostream> #include <queue> #include <vector> #include <set> #include <map> #include <stack> #define SQR(x) ((x)*(x)) #define rep(i, n) for (int i=0; i<(n); ++i) #define repd(i,n) for(int i=1;i<=(n);++i) #define repf(i, a, b) for (int i=(a); i<=(b); ++i) #define reps(i, a, b) for (int i=(a); i>=(b); --i) #define PB push_back #define MP(A, B) make_pair(A, B) #define pow2(n) (1<<(n)) #define pi acos(-1) #define eps 0.00000001 #define lg(n) log10((n)*1.0) #define MaxN 1000000 #define mod 10e+7 #define ll long long #define typed int using namespace std; void data(){ freopen("data3.out","r",stdin); freopen("data.out","w",stdout); } #define len ((1<<21)+100) double ans[len]; double p[210],q[210]; int main(){ //data(); int n,m,l,r; while(~scanf("%d%d%d%d",&n,&m,&l,&r)&&n){ repf(i,0,n){q[i]=0;p[i]=0;} int k; p[0]=1; rep(i,m){ scanf("%d",&k); rep(j,n) { if(p[j]-0<eps)continue; q[(j+k)%n]+=p[j]*0.5; q[(j-k+n)%n]+=p[j]*0.5; } rep(j,n){p[j]=q[j];q[j]=0.0;} } double sum=0; repf(i,l-1,r-1) sum+=p[i]; printf("%.4lf\n",sum); } return 0; }
B:java大数+数学(比赛的时候没能想起出正解~~~噢活~~弱者为何要战斗~~~渣)
C:裸的线段树
3种操作,1种查询~~~区间赋值,区间加上一个值,区间每个元素乘以一个值~~查询区间的p次方的和(p=1,2,3);
p只有1,2,3~~维护区间的3个和就好了~~延迟标记(加法与惩罚冲突),强制向下标记(如果操作的区间存在延迟标记的话);
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <climits> #include <cctype> #include <ctime> #include <algorithm> #include <iostream> #include <queue> #include <vector> #include <set> #include <map> #include <stack> #define SQR(x) ((x)*(x)) #define rep(i, n) for (int i=0; i<(n); ++i) #define repd(i,n) for(int i=1;i<=(n);++i) #define repf(i, a, b) for (int i=(a); i<=(b); ++i) #define reps(i, a, b) for (int i=(a); i>=(b); --i) #define PB push_back #define MP(A, B) make_pair(A, B) #define pow2(n) (1<<(n)) #define pi acos(-1) #define eps 0.00000001 #define lg(n) log10((n)*1.0) #define MaxN 1000000 #define mod 10007 #define mod2 1000000009 #define mod3 1000007 #define inf 2147483647 #define inf2 0x7fffffffffffffff #define ll long long #define lson(i) ((i)<<1) #define rson(i) ((i)<<1|1) #define typed int using namespace std; void data(){ freopen("data.in","r",stdin); freopen("data.out","w",stdout); } struct Tree{ int l,r; int mark; int val; int s1,s2,s3; }; Tree T[(MaxN<<2)+10]; //初始化 void init(int i,int l,int r){ T[i].l=l;T[i].r=r;T[i].mark=1; T[i].s1=0;T[i].s2=0;T[i].s3=0; T[i].val=0; if(l!=r){ int mid=(l+r)/2; init(lson(i),l,mid); init(rson(i),mid+1,r); } } //计算1,2,3次方和 void cnt(int id,int k){ int len =(T[id].r-T[id].l + 1); T[id].s1 = k * len % mod; T[id].s2 = ((k * k)%mod) * len %mod; T[id].s3 = ((k * k )%mod *k)%mod*len%mod; } //向下延迟标记 void pushdown(int id){ if(T[id].mark){ T[lson(id)].val=T[rson(id)].val=T[id].val%mod; cnt(lson(id),T[id].val%mod); cnt(rson(id),T[id].val%mod); T[lson(id)].mark = T[rson(id)].mark = T[id].mark; T[id].mark=0; } } //更新到父亲节点 void pushup(int id){ T[id].s1=T[lson(id)].s1 + T[rson(id)].s1; T[id].s2=T[lson(id)].s2 + T[rson(id)].s2; T[id].s3=T[lson(id)].s3 + T[rson(id)].s3; } /* * root:根节点,l:更新左区间,r:右区间, *c:更新值,p:操作(0:赋值,1:加,2:乘) */ void update(int root,int l,int r,int c,int p){ if(T[root].mark||!p) if(l<=T[root].l&&r>=T[root].r){ if(!p)T[root].mark=1; if(p==0) T[root].val=c; else if(p==1) T[root].val+=c; else T[root].val*=c; T[root].val%=mod; cnt(root,T[root].val); return ; } pushdown(root); int mid=(T[root].l+T[root].r)/2; if(l <= mid) update(lson(root),l,r,c,p); if(r > mid) update(rson(root),l,r,c,p); pushup(root); } //查询区间p次方和 int qurry(int root,int l,int r,int p){ if(T[root].mark){ if(l<=T[root].l&&r>=T[root].r){ if(p==1) return T[root].s1; if(p==2) return T[root].s2; if(p==3) return T[root].s3; } } if(T[root].mark)pushdown(root); int mid=(T[root].l+T[root].r)/2; if(r <= mid) return qurry(lson(root),l,r,p); if(l > mid) return qurry(rson(root),l,r,p); return (qurry(lson(root),l,r,p)+qurry(rson(root),l,r,p))%mod; pushup(root); } void show(int n){ repf(i,1,(n<<2)){ cout<<i<<" "<<T[i].l<<" "<<T[i].r<<" "<<T[i].mark<<" "<<T[i].val; cout<<" "<<T[i].s1<<" "<<T[i].s2<<" "<<T[i].s3<<endl; } } int main(){ //data(); int n,m; int k,x,y,c; while(~scanf("%d%d",&n,&m)&n){ init(1,1,n); rep(i,m){ scanf("%d%d%d%d",&k,&x,&y,&c); if(k==4)printf("%d\n",(qurry(1,x,y,c)+mod)%mod); else update(1,x,y,c,k%3); //show(n); } } return 0; }
I:水题,队友水过~~~
J:树状数组或者STL乱搞~~队友写STL挂掉了。。。结果是第一次固定的输出没对~~居然样例没过都能交了。。ORz,而且没人发现~~~而且导致我重写树状数组想复杂了写的很糟糕~~中间浪费大堆时间~~~比赛结束查队友代码,发现bug时候各种Orz~~~
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <climits> #include <cctype> #include <ctime> #include <algorithm> #include <iostream> #include <queue> #include <vector> #include <set> #include <map> #include <stack> #define SQR(x) ((x)*(x)) #define rep(i, n) for (int i=0; i<(n); ++i) #define repd(i,n) for(int i=1;i<=(n);++i) #define repf(i, a, b) for (int i=(a); i<=(b); ++i) #define reps(i, a, b) for (int i=(a); i>=(b); --i) #define PB push_back #define MP(A, B) make_pair(A, B) #define pow2(n) (1<<(n)) #define pi acos(-1) #define eps 0.00000001 #define lg(n) log10((n)*1.0) #define MaxN 100000 #define mod 1000000007 #define mod2 1000000009 #define mod3 1000007 #define inf 2147483647 #define inf2 0x7fffffffffffffff #define ll long long #define typed int using namespace std; void data(){ freopen("data.in","r",stdin); freopen("data.out","w",stdout); } struct point{ int id; int k; int g; }; int hashg[MaxN+10]; int hashk[MaxN+10]; point p[MaxN+100]; int c[MaxN+10],n; bool cmp(point a,point b){ return a.g<b.g; } bool cmp2(point a,point b){ return a.id<b.id; } void hsp(){ rep(i,n){ hashg[i+1]=p[i].g; p[i].g=i+1; hashk[i+1]=p[i].id; } hashg[n+1] = 1000000000; hashk[n+1] = n+1; } int Lowbit(int t) { return (t & ( -t )); } int Sum(int end) { int sum = 0; while(end > 0) { sum += c[end]; end -= Lowbit(end); } return sum; } int bitsearch(int n,int key) { int min=0,max=n+1,mid; while(min<max){ mid=(min+max)/2; int cnt=Sum(mid); if(key>cnt)min=mid+1; else max=mid; } return min; } void plus2(int pos,int num) { while(pos <= n) { c[pos] += num; pos += Lowbit(pos); } } int bit1(int l,int r,int key){ while(l<r){ int mid=(l+r)/2; int t=Sum(mid); if(t>key) r=mid-1; else if(t<key) l=mid+1; else r=mid; } return l; } int bit2(int l,int r,int key){ while(l<r){ int mid=(l+r)/2; int t=Sum(mid); if(t>key) r=mid; else l=mid+1; } return l; } int main(){ //data(); while(~scanf("%d",&n)&&n){ memset(c,0,sizeof(c)); rep(i,n){scanf("%d%d",&p[i].k,&p[i].g);p[i].id=i;} sort(p,p+n,cmp); hsp(); sort(p,p+n,cmp2); plus2(p[0].g,1); int q=n,ans; n=n+1; plus2(n,1); printf("%d %d\n",p[hashk[p[0].g]].k,1); p[n].k=1;p[n].g=n; repf(i,1,q-1){ int k1=bit1(0,n,Sum(p[i].g)); plus2(p[i].g,1); int k2=bit2(1,n,Sum(p[i].g)); if(k1==0) ans=p[hashk[k2]].k; else{ if(abs(hashg[p[hashk[k1]].g]-hashg[p[i].g])<abs(hashg[p[hashk[k2]].g]-hashg[p[i].g])) { ans=p[hashk[k1]].k; }else if(abs(hashg[p[hashk[k1]].g]-hashg[p[i].g])>abs(hashg[p[hashk[k2]].g]-hashg[p[i].g])){ ans=p[hashk[k2]].k; }else{ if((hashg[p[hashk[k1]].g])<(hashg[p[hashk[k2]].g])) ans=p[hashk[k1]].k; else ans=p[hashk[k2]].k; } } // cout<<k1<<" "<<k2<<" "<<hashg[k1]<<" "<<hashg[k2]<<endl; // cout<<"ans: "<<p[hashk[k1]].k<<" "<<p[hashk[k2]].k<<endl; printf("%d %d\n",p[i].k,ans); } } return 0; }