Test on 09/04/2016
滑稽樹?
(huajitree.pas/c/cpp)
【問題描述】
JZYZ的湖畔邊有一棵滑稽樹,每年的冬天滑稽樹上都會長出很多個滑稽果。我們用一個二維平面N,M描述每個滑稽果所能落下的位置,即每個滑稽果不可能落到我們所描述的二維平面之外。
?? 滑稽大師cdc鐘愛于收集滑稽果,但是他只有一個籃子,籃子只能放在一個點上,即一個籃子最多收集一個滑稽果。現在滑稽大師cdc想知道他收集到滑稽果的期望值是多少。(cdc放的籃子在任意位置的概率相同)
為了(zao)方(shu)便(ju)起(fang)見(bian),我們用一個數S描述這個二維平面。
例如:
S=32=(100000)2 ,N=2,M=3
其對應的二維平面為:
100
000
其中1表示滑稽果所落下的位置,即有一個滑稽果落在坐標為(1,1)的位置。
那么這個數據的答案就是 1*(1/(2*3))=1/6
例如:
S=33=(100001)2 ,N=2,M=3
其對應的二維平面為:
100
001
其中1表示滑稽果所落下的位置,即有一個滑稽果落在坐標為(1,1)的位置,有一個在坐標為(2,3)的位置。
那么這個數據的答案就是 1*(2/(2*3))=1/3.
【輸入】
輸入僅為1行三個正整數,分別為N,M,S
【輸出】
輸出僅一行,為期望值的既約分數。即輸出為a/b的形式,其中gcd(a,b)==1
如果期望值為0,輸出0即可,如果為1,輸出1/1
【輸入輸出樣例1】
| huajitree.in | huajitree.out |
| 2 3 32 | 1/6 |
【數據范圍】
對于70%的數據 ???? N*M<=31 S<=2^31
對于 100%的數據??? N*M<=63 S<=2^63
?
這題就是把一個數轉化為二進制,找里面有多少個1,然后用 個數/n*m
再找 gcd(個數,n*m) 然后 “個數?? /gcd” “/” “n*m/gcd”。
?
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 long long s; 5 int n,m,sum=0,t; 6 int gcd(int a,int b) 7 { 8 if(b==0) return a; 9 return gcd(b,a%b); 10 } 11 int main() 12 { 13 freopen("huajitree.in","r",stdin); 14 freopen("huajitree.out","w",stdout); 15 cin>>n>>m>>s; 16 while(s) 17 { 18 if(s%2==1) sum++; 19 s/=2; 20 } 21 t=gcd(n*m,sum); 22 if(sum==0) cout<<0<<endl; 23 else 24 cout<<sum/t<<'/'<<n*m/t<<endl; 25 fclose(stdin); fclose(stdout); 26 return 0; 27 }?
?
?
?
背包?
(pack.pas/c/cpp)
【問題描述】
滑稽大師cdc依靠每天的辛勤努力,終于收集到了足夠多的滑稽,每個滑稽有兩個屬性,分別是滑稽值h和體積v,他要把所有的滑稽帶走,但是cdc只有一個固定容積的背包。怎么才能帶走盡可能多的滑稽值呢?
因為cdc是神犇,所以他很輕松的解決了這個問題?,F在cdc來到了滑稽工廠,他要把所有的滑稽打包發給各個滑稽銷售點,但是每次打包cdc都要付出一定的代價。
我們把滑稽工廠打包滑稽的生產線看作一個一維線段,每個滑稽都是線段上的一個點,且每個滑稽的順序不可改變。
且每次打包滑稽只能是一段連續的區間,定義這個線段上從左到右第i個點的滑稽值為hi,體積為vi,設每次打包的區間為[i,j],則每次打包的代價為,現在cdc想知道他需要支付的最小代價為多少。他需要支付的代價為打包所有滑稽的代價和。
【輸入】
第一行為一個正整數N,表示N個滑稽
接下來的N行每行兩個正整數v,h,分別表示體積與滑稽值
【輸出】
輸出僅一行,表示cdc可能需要支付的最小代價
【輸入輸出樣例1】
| pack.in | pack.out |
| 4 1 4 2 3 3 2 4 1 | 85 /*分組為{1}{2}{3}{4} 85=4*1+(4+3)*2+(4+3+2)*3+(4+3+2+1)*4 */ |
【數據范圍】
對于60%的數據 N<=1000
對于100%的數據
N<=1000000
hi,vi<=500
保證答案在long long 范圍內
?
看著題目超級高大上,然而…小弱渣飄過
大暴力,估計是題目沒出好把,
Sum(vi*(sumhi));
?
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cmath> 5 #include<algorithm> 6 #include<ctime> 7 using namespace std; 8 long long a,x[1000000],y[1000000],z,w,h=0,sum=0,num=0; 9 string s; 10 int main() 11 { 12 freopen("pack.in","r",stdin); 13 freopen("pack.out","w",stdout); 14 cin>>a; 15 16 for(int i=1;i<=a;i++) 17 { 18 cin>>x[i]>>y[i]; 19 sum+=y[i]; 20 num+=sum*x[i]; 21 } 22 cout<<num<<endl; 23 return 0; 24 }?
?
?
?
?
街區運輸
? block(.pas/c/cpp)
【問題描述】
好的,現在你們已經完美的解決了打包的問題了,現在需要把這些滑稽分發給各個滑稽銷售點,
滑稽大師cdc想要把所有的滑稽分發出去,但是每個街區之間的道路有時候會因為各種原因而封閉掉,導致無法運輸,cdc可以通過膜法瞬間知道哪些道路封閉了或那些道路又重新開放了(注:一個道路可能會封閉好幾次,但是每次開放與之前封閉了幾次無關)。他想知道從一個街區到另一個街區是否有可以到達的道路。
每個街區分布在NxM的二維平面上,同時保證N=2,也就是說這個二維平面只有兩行M列,其中每個焦點代表一個街區。同時保證每次封閉和重新開放的道路一定在兩個相鄰的城市之間,在開始時所有的道路都是封閉的。
【輸入】
第一行為正整數M,代表這是一個2*M的二維平面。
接下來的若干行,分別有4種形式.
//數據保證以上所有的(x1,y1) (x2,y2)在平面上相鄰
【輸出】
對于每個詢問,輸出1行,如果存在,請輸出Y,如果不存在,請輸出N
【輸入輸出樣例1】
| block.in | block.out |
| 2 Open 1 1 1 2 Open 1 2 2 2 Ask 1 1 2 2 Ask 2 1 2 2 Exit ? | Y N |
?
【數據范圍】
對于100%的數據保證N<=1e5 所有信息小于1e5
對于30%的數據保證N<=100
對于另外30%的數據保證N<=10000
?
我簡單廢話一下,本題所需要的數據結構就是線段樹,簡單的說就是用線段樹維護連通性,高二的各位神犇你們說良心不良心呀。
怎么用線段樹維護連通性呢?
反正我是用一個線段樹里維護6個值,分別是
左上到左下的連通性
左上到右下的連通性
左上到右上的連通性
左下到右下的連通性
左下到右上的連通性
右上到右下的連通性
維護四個值好像也沒什么問題,具體的自己思考
然后合并什么的就很好(ma)搞(fan)了
具體的實現可以參考我180行的代碼,雖然寫的很丑..
當然,本題沒有強制在線,分塊+并查集隨便搞搞也可以過
COGS上有一個神犇90行就解決了,你們也可以去看看他的代碼
?
1 //BZOJ 1018 2 //by Cydiater 3 //2016.8.24 4 #include <iostream> 5 #include <cstring> 6 #include <cstdio> 7 #include <cstdlib> 8 #include <string> 9 #include <ctime> 10 #include <cmath> 11 #include <queue> 12 #include <map> 13 #include <iomanip> 14 #include <algorithm> 15 using namespace std; 16 #define FILE "block" 17 #define ll long long 18 #define up(i,j,n) for(int i=j;i<=n;i++) 19 #define down(i,j,n) for(int i=j;i>=n;i--) 20 const int MAXN=1e5+5; 21 const int oo=0x3f3f3f3f; 22 inline int read(){ 23 char ch=getchar();int x=0,f=1; 24 while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} 25 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 26 return x*f; 27 } 28 struct Tree{ 29 bool luru;/*left up to right up*/ 30 bool ldrd;/*left down to right down*/ 31 bool lurd;/*left up to right down*/ 32 bool ldru;/*left down to right up*/ 33 bool luld;/*left up ro left down*/ 34 bool rurd;/*right up to right down*/ 35 }t[MAXN<<4]; 36 bool toright[2][MAXN],pipe[MAXN]; 37 int N,r1,c1,r2,c2,k,v,limleft,limright,cnt=0; 38 char s[20]; 39 namespace solution{ 40 Tree reload(Tree a,Tree b,bool upedge,bool downedge){ 41 Tree c; 42 c.luld=a.luld;c.rurd=b.rurd; 43 c.luru=(a.luru&upedge&b.luru)|(a.lurd&downedge&b.ldru); 44 c.ldrd=(a.ldrd&downedge&b.ldrd)|(a.ldru&upedge&b.lurd); 45 c.lurd=(c.luru&c.rurd)|(c.luld&c.ldrd)|(a.luru&upedge&b.lurd)|(a.lurd&downedge&b.ldrd); 46 c.ldru=(c.ldrd&c.rurd)|(c.luld&c.luru)|(a.ldrd&downedge&b.ldru)|(a.ldru&upedge&b.luru); 47 c.luld=c.luld|(c.lurd&c.ldrd)|(c.ldru&c.luru)|(a.luru&upedge&b.luld&downedge&a.ldrd); 48 c.rurd=c.rurd|(c.lurd&c.luru)|(c.ldru&c.ldrd)|(b.luru&upedge&a.rurd&downedge&b.ldrd); 49 return c; 50 } 51 void build(int leftt,int rightt,int root){ 52 if(leftt==rightt){ 53 t[root].luru=t[root].ldrd=1; 54 t[root].lurd=t[root].ldru=t[root].luld=t[root].rurd=0; 55 return; 56 } 57 int mid=(leftt+rightt)>>1; 58 t[root].luru=t[root].ldrd=t[root].lurd=t[root].ldru=t[root].luld=t[root].rurd=0; 59 build(leftt,mid,root<<1); 60 build(mid+1,rightt,root<<1|1); 61 } 62 void updata1(int leftt,int rightt,int root){ 63 if(leftt>k||rightt<k) return; 64 if(leftt==k&&rightt==k){ 65 t[root].luld=t[root].rurd=t[root].lurd=t[root].ldru=v; 66 return; 67 } 68 int mid=(leftt+rightt)>>1; 69 updata1(leftt,mid,root<<1); 70 updata1(mid+1,rightt,root<<1|1); 71 t[root]=reload(t[root<<1],t[root<<1|1],toright[0][mid],toright[1][mid]); 72 } 73 void updata2(int leftt,int rightt,int root){ 74 if(leftt>k||rightt<k) return; 75 if(leftt==k&&rightt==k) return; 76 int mid=(leftt+rightt)>>1; 77 updata2(leftt,mid,root<<1); 78 updata2(mid+1,rightt,root<<1|1); 79 t[root]=reload(t[root<<1],t[root<<1|1],toright[0][mid],toright[1][mid]); 80 } 81 Tree get(int leftt,int rightt,int root){ 82 Tree a,b,c; 83 if(leftt>=limleft&&rightt<=limright) return t[root]; 84 int mid=(leftt+rightt)>>1; 85 if(mid+1<=limleft) return get(mid+1,rightt,root<<1|1); 86 else if(limright<=mid) return get(leftt,mid,root<<1); 87 else{ 88 a=get(leftt,mid,root<<1); 89 b=get(mid+1,rightt,root<<1|1); 90 c=reload(a,b,toright[0][mid],toright[1][mid]); 91 } 92 return c; 93 } 94 void slove(){ 95 memset(toright,0,sizeof(toright)); 96 while(scanf("%s",s)!=EOF){ 97 if(s[0]=='E')break; 98 if(s[0]=='O'){ 99 c1=read();r1=read();c2=read();r2=read(); 100 if(r1==r2&&c1!=c2){ 101 k=r1;v=1;pipe[k]=1; 102 updata1(1,N,1); 103 } 104 if(r1!=r2&&c1==c2){ 105 r1=min(r1,r2);k=r1; 106 toright[c1-1][r1]=1; 107 updata2(1,N,1); 108 } 109 } 110 if(s[0]=='C'){ 111 c1=read();r1=read();c2=read();r2=read(); 112 if(r1>r2){ 113 swap(r1,r2); 114 swap(c1,c2); 115 }/*make sure that r1<=r2*/ 116 if(r1==r2&&c1!=c2){ 117 k=r1;v=0;pipe[k]=0; 118 updata1(1,N,1); 119 } 120 if(r1!=r2&&c1==c2){ 121 r1=min(r1,r2); 122 toright[c1-1][r1]=0;k=r1; 123 updata2(1,N,1); 124 } 125 } 126 if(s[0]=='A'){ 127 c1=read();r1=read();c2=read();r2=read(); 128 if(c1==c2&&r1==r2){puts("Y");continue;} 129 if(r1>r2){ 130 swap(r1,r2); 131 swap(c1,c2); 132 }/*make sure that r1<=r2*/ 133 limleft=1;limright=r1;Tree go_left=get(1,N,1); 134 limleft=r1;limright=r2;Tree go_mid=get(1,N,1); 135 limleft=r2;limright=N;Tree go_right=get(1,N,1); 136 if(r1==r2&&c1!=c2){ 137 if(go_left.rurd||go_right.luld||go_mid.luld)puts("Y"); 138 else puts("N"); 139 } 140 if(r1!=r2&&c1==c2){ 141 if(c1==1){ 142 if((go_left.rurd&go_mid.ldrd&go_right.luld)||go_mid.luru||(go_left.rurd&go_mid.ldru)||(go_right.luld&go_mid.lurd))puts("Y"); 143 else puts("N"); 144 }else{ 145 if((go_left.rurd&go_mid.luru&go_right.luld)||go_mid.ldrd||(go_left.rurd&go_mid.lurd)||(go_right.luld&go_mid.ldru))puts("Y"); 146 else puts("N"); 147 } 148 } 149 if(r1!=r2&&c1!=c2){ 150 if(c1==1){/*left up to right down*/ 151 if((go_left.rurd&go_mid.ldrd)||go_mid.lurd||(go_left.rurd&go_mid.ldru&go_right.luld)||(go_mid.luru&go_right.luld))puts("Y"); 152 else puts("N"); 153 }else{/*left down to right up*/ 154 if((go_left.rurd&go_mid.luru)||go_mid.ldru||(go_left.rurd&go_mid.lurd&go_right.luld)||(go_mid.ldrd&go_right.luld))puts("Y"); 155 else puts("N"); 156 } 157 } 158 } 159 } 160 } 161 } 162 int main(){ 163 freopen(FILE".in","r",stdin); 164 freopen(FILE".out","w",stdout); 165 using namespace solution; 166 N=read(); 167 build(1,N,1); 168 slove(); 169 return 0; 170 }?
轉載于:https://www.cnblogs.com/Kaike/p/5861568.html
總結
以上是生活随笔為你收集整理的Test on 09/04/2016的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转载]我的PMP复习备考经验谈(下篇)
- 下一篇: Apache-SimpleEmail 简