より困難な問題のいくつかの既存のコードについてのAC:
1002年:
#include <ビット/ STDC ++ H> 名前空間STDを使用して、 #define Fiの第一 の#define SE第二 のconst int型MAXN = 15000000。 const int型N = 110000; int型T; N INT、M。 INT和[MAXN]、POS、[N]。 構造体ノード { int型LL、RR。 } TR [MAXN]。 対<整数、整数> B [N]。 マップ<int型、int型> IDX。 <整数> del_numsを設定します。 <整数>設定::イテレータit。 INT F [N]。 インラインINT lowbit(INT X) { 戻りX&-x。 } INT ROOT1 [N]、root2 [N]、PP [N]。 INTコピー(INT X) { ++ POS。 和[POS] =和[X]。 TR [POS]の.ll = TR [X]の.ll。 TR [POS] .rr = TR [X] .rr。 POSを返します。 } ボイド追加(int型K、int型のL、R INT、INT X) { 和[K] ++; (L == R)戻った場合。 INT半ば=(L + R)/ 2。 IF(X <= MID) { TR [K]の.ll =コピー(T R [K]の.ll)。 (TR [K]の.ll、L、中、X)を加えます。 } 他 { TR [K] .rr =コピー(TR [K] .rr)。 (TR [K] .rr、中間+ 1、R、X)を加えます。 } } int型(int型K、int型のL、R INT、INT X)尋ねる { IF(和[K] == 0)リターンN + 1と、 IF(L == R)戻りL。 INT半ば=(L + R)/ 2。 IF(L> = X) { IF(和[TR [K]の.ll])リターン(TR [K]の.ll、L、中、X)を尋ねます。 他リターン尋ねる(TR [K] .rr、中間+ 1、R、X)。 } 他 { int型RES。 であれば(MID <X)RES = N + 1。 他のRES =で頼む(TR [K]の.ll、L、中、X)。 IF(RES == N + 1)リターン尋ねる(TR [K] .rr、中間+ 1、R、X)。 他のリターンのres; } } int型のmain() { scanf関数( "%のD"、&T)。 一方、(T--) { scanf関数( "%d個の%のD"、&N、&M)。 以下のために(INT i = 1; iは++; iが= N <) ("%d個"、&[i])とscanf関数を、B [i]は.fi [i]は、B [i]は.SE = I、PPの[し= I] = 0; ソート(B + 1、B + 1個の+ N)。 逆(B + 1、B + 1 + N)。 idx.clear(); 以下のために(INT i = 1; iが<= N; iは++) IDX [I] = I。 { IF(I> 1件の&& B [I] .fi + 1つの== bの[I-1] .fi)F [B [i]は.SE] = F [B [I-1] .SE]。 他F [B [i]は.SE] = bの[I] .fi。 } POS = 0。 root2 [N + 1] =コピー(0)。 以下のために(INT I = N; I> = 1; i--) { root2 [i]は=コピー(root2 [I + 1])。 ([I]、1、nは、[I] root2)を加えます。 } INT lastans = 0。 del_nums.clear(); del_nums.insert(N + 1)。 一方、(M--) { int型のOP、X、R、K。 scanf関数( "%のD"、&OP)。 IF(OP == 1) { scanf関数( "%のD"、&x)は、 X = X ^ lastans。 IF(!PP [X]) { INT TMP = X。 PP [X] = 1。 del_nums.insert([X])。 idx.erase([X])。 } } 他 { scanf関数( "%dの%のD"、&R&K)。 R = R ^ lastans。 K = K ^ lastans。 IF(!idx.count(K)|| IDX [K]> R)のprintf( "%d個の\ n"、K)、lastans = K。 他 { int型のPOS = IDX [K]。 INT X = F [POS]。 yはint型。 1 +(R == N)、Y = Nであれば、 そうでなければ、Y =尋ねる(root2 [R + 1]、1、n、k)は、 それはdel_nums.lower_bound(k)を=。 int型のz = *それ。 lastans =分(X、分(Y-1、Z-1))+ 1。 printf( "%d個の\ n"、lastans)。 } } } } 0を返します。 }
1005年:
#include <ビット/ STDC ++ H> の#defineは長い長いllの 名前空間stdを使用します。 const int型MAXN = 1E6 + 10。 CONST LL MOD = 1E9 + 7。 CONSTのLL INV2 = 5E8 + 4。 constのLL INV6 = 166666668; プライム[MAXN] INT、[MAXN]ファイ。 LL和[MAXN]。 BOOL VIS [MAXN]。 int型CNT = 0; INITを無効(){ PHI [1] = 1。 以下のために(INT I = 2、I <MAXN; iは++){ (!VIS [I])であればプライム[++ CNT] = I、PHI [i]は= I-1 ;; 用(INTのJ = 1; iが素数[j]を* && J <= CNT <MAXN; J ++){ VIS [i *が素数[J] = TRUE; IF(I%プライム[j] == 0){ PHI [iが素数* [J] = PHI [I] *プライム[J]。 ブレーク; } 他のPHI [私は*プライム[J] = PHI [i]は*(プライム[J] -1)。 } } 和[0] = 0。 以下のために(INT i = 1; iは<MAXN; iは++){ 和[I] =(SUM [I-1] + 1LL * i *がPHI [i])と%MOD。 } } unordered_map <-1,11,11->融点; LL一方(LL n)が{ N%= MOD。 リターンN *(N + 1)%MOD * INV2の%のMOD。 } LL SQU(LL n)が{ N%= MOD。 リターンN *(N + 1)%MOD *((2 * N + 1)%のMOD)%MOD * INV6の%のMOD。 } LL F(LL N){ IF(N <MAXN)戻り和[N]。 IF(mp.count(N))戻りMP [N]; LL RES = SQU(N)。 用(LL 1 = 2、R、L <= N; L = R + 1){ R = N /(N / L)。 LLのTMP =(1(R) -オン(L-1)+ MOD)%MOD。 RES - = TMP * F(N / L)%MOD。 IF(RES <0)RES + = MOD。 } 戻りMP [N] =のRES。 } int型のmain(){ INIT()。 int型T; scanf関数( "%のD"、&T)。 (T--){一方 LL nは、B。 scanf関数( "%LLD%LLD%LLD"、&N、&、&B)。 LLのTMP = F(N)。 LL ANS =(TMP + 1)* INV2の%のMOD。 ANS =(ANS-1 + MOD)%のMOD。 printf( "%LLDする\ n"、(ANS%のMOD + MOD)%のMOD)。 } 0を返します。 }
1008年:
#pragma GCCの最適化( "Ofast") の#include <ビット/ STDC ++。H> の#defineがっ長い長 の#define ULL符号なし長い長 の#define Fiの最初 の#define SE第二 の#define MP make_pair の#define PII対<-1,11,11-> 全ての#define(X)x.begin()、x.end() の#define IO IOS :: sync_with_stdio(偽); cin.tie(0); cout.tie(0) の#define担当者(II、B )(INT II =用; II <= B; ++ II) II(あたりの#define、B)(INT II = Bの; II> =; - II) の#define forn(I、XをI;(INT I = G [X]のために、G、E)は、I = E [I] .next) の#defineショー(X)COUT <<#1 X << "=" << X << ENDL の#define昭和(a、b)はCOUT <<#<< '[' << B << "] =" << [B] << ENDL の#define show2(X、Y)COUT <<#1 X <<」= "<< X <<" "<<#1 Y <<" = "<< Y << ENDL A)担当者(j、0、B)COUT <<#X << '[' << I << ']' << '[' << J << "] =" << X [i]は[J ] <<( "の\ n" [J == B]) の#define showm(X、a、b)は担当者(I、0、a)の担当者(j、0、B)COUT << X [i]は[J ] <<( "の\ n" [J == B]) の#define showa1(X、a、b)は担当者(I、a、b)は昭和(X、I); COUT << ENDL の#define showa2(X、 、B)のrep(I、a、b)はCOUT << X [i]は<<」「; COUT << ENDL 名前空間stdを使用。 CONST int型MAXN = 1E5 + 10、MAXM = 3E5 + 10。 CONST LL INF = 0x3f3f3f3f、MOD = 1E9 + 7。 int型CASN、N、M、K、CNT = 1。<( "の\ n" [J == B]) の#define showa1(X、a、b)は担当者(I、a、b)は昭和(X、I); COUT << ENDL の#define showa2(X、 b)の担当者(I、a、b)はCOUT << X [i]は<<」「; COUT << ENDL 名前空間stdを使用。CONST int型MAXN = 1E5 + 10、MAXM = 3E5 + 10。CONST LL INF = 0x3f3f3f3f、MOD = 1E9 + 7。int型CASN、N、M、K、CNT = 1。<( "の\ n" [J == B]) の#define showa1(X、a、b)は担当者(I、a、b)は昭和(X、I); COUT << ENDL の#define showa2(X、 b)の担当者(I、a、b)はCOUT << X [i]は<<」「; COUT << ENDL 名前空間stdを使用。CONST int型MAXN = 1E5 + 10、MAXM = 3E5 + 10。CONST LL INF = 0x3f3f3f3f、MOD = 1E9 + 7。int型CASN、N、M、K、CNT = 1。 PRIORITY_QUEUE <整数> QUE。 INT {main()の IO。 cinを>> CASN。 一方、(casn--){ cinを>> CASN。一方、(casn--){ cinを>> CASN。一方、(casn--){ CIN >> N >> K。 CNT = 1。 LL和= K。 (!que.empty())que.pop()しばらく; 担当者(I、1、N){ LLのTMP = 0。 cinを>> TMP; CNT + = TMP / K。 合計+ = TMP; IF(TMP%K)que.push(TMPの%のK)。 } 担当者(I、CNT、N-1){ 合計+ = k-que.top()。 que.pop(); } COUT <<和<< ENDL。 } 0を返します。 }