生活随笔
收集整理的這篇文章主要介紹了
Codeforces Round #760 (Div. 3)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
E. Singers’ Tour
F. Reverse
G. Trader Problem
?推推式子就行了。
int a
[N
];
int main()
{int t
;scanf("%d", &t
);while(t
--){int n
;LL sum
= 0;scanf("%d", &n
);for(int i
= 1;i
<= n
;i
++) scanf("%d", a
+i
), sum
+= a
[i
];a
[0] = a
[n
];if(sum
%(n
*(n
+1)/2)){puts("NO");continue;}sum
/= n
*(n
+1)/2;for(int i
= n
;i
>=1;i
--){if((sum
-a
[i
]+a
[i
-1])%n
|| sum
-a
[i
]+a
[i
-1]<=0){puts("NO");a
[1] = 0;break;}a
[i
] = (sum
-a
[i
]+a
[i
-1])/n
;} if(a
[1]){puts("YES");for(int i
= 1;i
<= n
;i
++)cout
<<a
[i
]<<' ';cout
<<endl
;}}return 0;
}
?爆搜, 寫的很煩。
LL x
, y
;
string a
, b
;
map
<string
, bool>ma
;
bool flag
= 0;
string
fan(string c
)
{string a
= c
;while(a
.back() == '0') a
.pop_back();reverse(a
.begin(), a
.end());return a
;
}void inverse(LL x
, string
&a
)
{while(x
)a
+= (char)('0'+(x
&1)), x
>>=1;reverse(a
.begin(), a
.end());return ;
}void dfs(string a
)
{if((a
.size() > b
.size() && a
.back() == '1') || ma
[a
]) return ; if(a
.size() == b
.size()) flag
|= a
== b
|fan(a
) == b
;ma
[a
] = 1; if(a
.back() == '0')dfs(fan(a
+'1')), dfs(fan(a
));else {ma
[fan(a
)] = 1;dfs('1'+a
); dfs(a
+'1');}return ;
}int main()
{ scanf("%lld%lld", &x
, &y
);inverse(x
, a
); inverse(y
, b
);dfs(a
);puts(flag
? "YES" : "NO");return 0;
}
?首先肯定要離線,然后還得把n+m個數(shù)排個序,那么就可以看作是一系列的連通塊,連通塊可以合并的條件是左邊的最大值+k >= 右邊的最小值,那么這就說明假設(shè)兩個連通塊內(nèi)原本有a個數(shù)是n個數(shù)中的(a < n), 那么就可以從這兩個連通塊的范圍內(nèi)取最大的a個數(shù)。
?寫起來也有點繞,原本想直接set,但是太難寫了,然后就改成了優(yōu)先隊列,但發(fā)現(xiàn)優(yōu)先隊列不能刪除,如果要標(biāo)記的話就要每個連通塊的范圍,但這樣又想到了可以直接模擬,就直接模擬了,代碼有注釋
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <map>
#include <queue>
#define mid (l+r>>1)
#define lowbit(x) (x&-x)
using namespace std
;
typedef long long LL
;
typedef pair
<int,int> PII
;
const int N
= 2e6+10, mod
= 998244353;
void mull(int &a
, LL b
){a
= a
*b
%mod
;return ;}
void add(int &a
, LL b
){a
= (a
+b
)%mod
;return ;}pair
<int,bool> a
[N
];
PII Q
[N
], b
[N
];
LL x
[N
], an
[N
];
int y
[N
], l
[N
], r
[N
], idx
= 1; LL
quary(int l
, int r
){return x
[r
]-x
[r
-y
[r
]+y
[l
-1]];} int main()
{ int n
, m
, q
;LL ans
= 0;scanf("%d%d%d", &n
, &m
, &q
);m
+= n
;for(int i
= 1;i
<= m
;i
++){scanf("%d", &a
[i
].first
);a
[i
].second
= i
<= n
;}for(int i
= 1;i
<= q
;i
++){scanf("%d", &Q
[i
].first
);Q
[i
].second
= i
;}sort(a
+1, a
+m
+1); a
[m
+1] = {2e9+1, 0}; sort(Q
+1, Q
+q
+1);for(int i
= 1;i
<= m
;i
++){x
[i
] = a
[i
].first
+ x
[i
-1]; y
[i
] = a
[i
].second
+ y
[i
-1]; b
[i
] = {a
[i
+1].first
-a
[i
].first
, i
}; l
[i
] = r
[i
] = i
; ans
+= a
[i
].second
? a
[i
].first
: 0 ;}sort(b
+1, b
+m
+1); for(int i
= 1;i
<= q
;i
++){int k
= Q
[i
].first
, id
= Q
[i
].second
; while(b
[idx
].first
<= k
){int R
= b
[idx
].second
, L
= l
[R
], t
= r
[R
+1]; ans
-= quary(L
, R
) + quary(R
+1, t
) - quary(L
, t
); l
[t
] = L
; r
[L
] = t
;++ idx
;}an
[id
] = ans
;}
for(int i
= 1;i
<= q
;i
++) cout
<<an
[i
]<<endl
; for(int i
= 1;i
<= q
;i
++) printf("%lld\n", an
[i
]);return 0;
}
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結(jié)
以上是生活随笔為你收集整理的Codeforces Round #760 (Div. 3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。