1. 程式人生 > >牛客練習賽30-A/C

牛客練習賽30-A/C

初賽 就是 long cout 當前 min || 麻煩 clip

鏈接:https://ac.nowcoder.com/acm/contest/216/A
來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld

題目描述

眾所周知,小K是nowcoder的暴政茍管理,所以小K很擅長踢樹,雖然本題與踢樹無關
小K喜歡將日期排列成yyyy-mm-dd的形式(位數不足添零補齊)的形式,雖然這與小K只會做回文字符串這道水題無關,但小K覺得日期組成的回文串也是挺可愛的。作為一個涼心出題人,小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