牛客練習賽30-A/C
阿新 • • 發佈:2018-11-04
初賽 就是 long cout 當前 min || 麻煩 clip
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld
小K喜歡將日期排列成yyyy-mm-dd的形式(位數不足添零補齊)的形式,雖然這與小K只會做回文字符串這道水題無關,但小K覺得日期組成的回文串也是挺可愛的。作為一個涼心出題人,小K決定給你一個可愛的問題:給你兩個日期,求這兩個日期的閉區間內有多少個回文的日期(輸入可能包含多組數據)
鏈接:https://ac.nowcoder.com/acm/contest/216/A
來源:牛客網
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld
題目描述
眾所周知,小K是nowcoder的暴政茍管理,所以小K很擅長踢樹,雖然本題與踢樹無關輸入描述:
第一行包含一個整數T,表示有T組數據
接下來T行,每行兩個“yyyy-mm-dd"形式的日期
輸出描述:
輸出共T行,每行輸出當前數據的回文日期的個數
示例1
輸入
復制1
1926-08-16
2333-12-21
輸出
復制36
備註:
對於100%的數據,1 ≤ ?? ≤ 10,且日期的形式一定是 YYYY-MM-DD,且輸 入日期一定合法,保證答案的年份不會超過4位
一個巧妙地方案是直接枚舉 mm-dd所有的格式,然後列出所有合法的日期對應的數字再判斷是否在區間之內即可。。相當於把日期映射為一個整數。
我很二逼的打了個表= =
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define LL long long
4 #define ULL unsigned long long
5 int f[10000][13][32];
6 int d[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
7 bool isr(int n){return n%4==0&&n%100!=0||n%400==0;}
8 int cal(int y,int m,int d){
9 char s1[15];
10 sprintf(s1,"%04d%02d%02d",y,m,d);
11 for(int i=0;i<4;++i){
12 if(s1[i]!=s1[7-i]) return 0;
13 }
14 return 1;
15 }
16 int A[]={
17 101,110,111,120,121,130,140,150,160,170,180,190,201,210,211,220,221,230,240,250,260,270,280,290,301,310,311,321,330,340,350,360,370,380,390,1001,1010,1011,1020,1021,1030,1040,1050,1060,1070,1080,1090,1101,1110,1111,1120,1121,1130,1140,1150,1160,1170,1180,1190,1201,1210,1211,1220,1221,1230,1240,1250,1260,1270,1280,1290,1301,1310,1321,1330,1350,1370,1380,2001,2010,2011,2020,2021,2030,2040,2050,2060,2070,2080,2090,2101,2110,2111,2120,2121,2130,2140,2150,2160,2170,2180,2190,2201,2210,2211,2220,2221,2230,2240,2250,2260,2270,2280,2290,3001,3010,3011,3020,3021,3030,3040,3050,3060,3070,3080,3090,3101,3110,3111,3120,3121,3130,3140,3150,3160,3170,3180,3190,3201,3210,3211,3220,3221,3230,3240,3250,3260,3270,3280,3290,4001,4010,4011,4020,4021,4030,4040,4050,4060,4070,4080,4090,4101,4110,4111,4120,4121,4130,4140,4150,4160,4170,4180,4190,4201,4210,4211,4220,4221,4230,4240,4250,4260,4270,4280,4290,5001,5010,5011,5020,5021,5030,5040,5050,5060,5070,5080,5090,5101,5110,5111,5120,5121,5130,5140,5150,5160,5170,5180,5190,5201,5210,5211,5220,5221,5230,5240,5250,5260,5270,5280,5290,6001,6010,6011,6020,6021,6030,6040,6050,6060,6070,6080,6090,6101,6110,6111,6120,6121,6130,6140,6150,6160,6170,6180,6190,6201,6210,6211,6220,6221,6230,6240,6250,6260,6270,6280,6290,7001,7010,7011,7020,7021,7030,7040,7050,7060,7070,7080,7090,7101,7110,7111,7120,7121,7130,7140,7150,7160,7170,7180,7190,7201,7210,7211,7220,7221,7230,7240,7250,7260,7270,7280,7290,8001,8010,8011,8020,8021,8030,8040,8050,8060,8070,8080,8090,8101,8110,8111,8120,8121,8130,8140,8150,8160,8170,8180,8190,8201,8210,8211,8220,8221,8230,8240,8250,8260,8270,8280,8290,9001,9010,9011,9020,9021,9030,9040,9050,9060,9070,9080,9090,9101,9110,9111,9120,9121,9130,9140,9150,9160,9170,9180,9190,9201,9210,9211,9220,9221,9230,9240,9250,9260,9270,9280,9290};
18 int B[]={
19 10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,12,3,5,7,8,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9,10,1,11,2,12,3,4,5,6,7,8,9
20 };
21 int C[]={
22 10,10,10,10,10,10,10,10,10,10,10,10,20,20,20,20,20,20,20,20,20,20,20,20,30,30,30,30,30,30,30,30,30,30,30,1,1,1,1,1,1,1,1,1,1,1,1,11,11,11,11,11,11,11,11,11,11,11,11,21,21,21,21,21,21,21,21,21,21,21,21,31,31,31,31,31,31,31,2,2,2,2,2,2,2,2,2,2,2,2,12,12,12,12,12,12,12,12,12,12,12,12,22,22,22,22,22,22,22,22,22,22,22,22,3,3,3,3,3,3,3,3,3,3,3,3,13,13,13,13,13,13,13,13,13,13,13,13,23,23,23,23,23,23,23,23,23,23,23,23,4,4,4,4,4,4,4,4,4,4,4,4,14,14,14,14,14,14,14,14,14,14,14,14,24,24,24,24,24,24,24,24,24,24,24,24,5,5,5,5,5,5,5,5,5,5,5,5,15,15,15,15,15,15,15,15,15,15,15,15,25,25,25,25,25,25,25,25,25,25,25,25,6,6,6,6,6,6,6,6,6,6,6,6,16,16,16,16,16,16,16,16,16,16,16,16,26,26,26,26,26,26,26,26,26,26,26,26,7,7,7,7,7,7,7,7,7,7,7,7,17,17,17,17,17,17,17,17,17,17,17,17,27,27,27,27,27,27,27,27,27,27,27,27,8,8,8,8,8,8,8,8,8,8,8,8,18,18,18,18,18,18,18,18,18,18,18,18,28,28,28,28,28,28,28,28,28,28,28,28,9,9,9,9,9,9,9,9,9,9,9,9,19,19,19,19,19,19,19,19,19,19,19,19,29,29,29,29,29,29,29,29,29,29,29,29
23 };
24 int N=366;
25 int cmp(int o,int a,int b,int c){
26 if(A[o]<a) return -1;
27 if(A[o]>a) return 1;
28 if(B[o]<b) return -1;
29 if(B[o]>b) return 1;
30 if(C[o]<c) return -1;
31 if(C[o]>c) return 1;
32 return 0;
33 }
34 int main()
35 {
36 int t,i,j,k;
37 while(scanf("%d",&t)!=EOF){
38 while(t--){
39 int a1,a2,b1,b2,c1,c2;
40 scanf("%d-%d-%d",&a1,&b1,&c1);
41 scanf("%d-%d-%d",&a2,&b2,&c2);
42 int ans=0;
43 for(int i=0;i<N;++i){
44 int t1=cmp(i,a1,b1,c1),t2=cmp(i,a2,b2,c2);
45 if((t1==0||t1==1)&&(t2==0||t2==-1)) ans++;
46 }
47 printf("%d\n",ans);
48 }
49 }
50 return 0;
51 }
鏈接:https://ac.nowcoder.com/acm/contest/216/C
來源:牛客網
題目描述
眾所周知,小K是一只連NOIP2018初賽都沒有過的蒟蒻,所以小K很擅長dfs序+分塊樹,但是本題與dfs序+分塊樹無關。 小K現在心態爆炸了,因為小K被一道簡單的數據結構題給卡住了,希望請你來解決它,但是小K又不想太麻煩你,於是將題面進行了簡化(其實是出題人懶得寫題面了233333):
Bob有??個點的樹,每條邊的長度有一個邊權,現在定義??????(??,??)代表第??個點到第??個點的距離模2之後的結果。問有多少(??,??,??)滿足,??????(??,??) = ??????(??,??) = ??????(??,??)。
輸入描述:
第一行一個整數??代表點的數量。
接下來?? − 1行每行三個數??,??,??代表有一條在??,??之間長度為??的邊。
輸出描述:
一行一個整數代表有多少對(??,??,??)滿足條件。
示例1
輸入
復制3
1 2 3
1 3 4
輸出
復制9
備註:
對於100%的數據,1 ≤ ?? ≤ 10000,0 ≤ ?? ≤ 233。
觀察後會發現,假設到root距離是奇數的點有x個,為奇數的點有y個,x+y=n ,那麽對於同一類的那些點他們彼此之間的距離也是這一種類型,dfs求一下奇偶數量,然後答案就是x^3+y^3,因為數可以重復。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 #define pii pair<int,int> 5 #define mp make_pair 6 #define _0 first 7 #define _1 second 8 const int maxn=10010; 9 LL f[maxn][2]; 10 vector<pii>g[maxn]; 11 void dfs(int u,int fa){ 12 f[u][0]=1; 13 for(int i=0;i<g[u].size();++i){ 14 int v=g[u][i]._0,w=g[u][i]._1; 15 if(v==fa)continue; 16 dfs(v,u); 17 if(w%2==1)f[u][0]+=f[v][1],f[u][1]+=f[v][0]; 18 else f[u][0]+=f[v][0],f[u][1]+=f[v][1]; 19 } 20 } 21 int main(){ 22 int n,u,v,w,i; 23 scanf("%d",&n); 24 for(i=1;i<n;++i){ 25 scanf("%d%d%d",&u,&v,&w); 26 g[u].push_back(mp(v,w)); 27 g[v].push_back(mp(u,w)); 28 } 29 dfs(1,0); 30 cout<<f[1][0]*f[1][0]*f[1][0]+f[1][1]*f[1][1]*f[1][1]<<endl; 31 return 0; 32 }
牛客練習賽30-A/C