A、前后前后输出一下
#include<bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define debug(x) cout<<#x<<" is "<<x<<endl
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define DBG 0
const int N = 300 + 5;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll LLINF = (1LL<<60);
using namespace std;
const int mod = 998244353;
ll fast_pow(ll a,ll b){
ll ans = 1;
while(b){
if(b&1)ans = (ans * a)%mod;
a = (a * a)%mod;
b>>=1;
}
return (ans%mod);
}
inline int read()
{
int X=0; bool flag=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
if(flag) return X;
return ~(X-1);
}
inline void write(ll X)
{
if(X<0) {X=~(X-1); putchar('-');}
if(X>9) write(X/10);
putchar(X%10+'0');
}
typedef pair<int,int> pii;
int a[N];
void solve(){
int n;
cin>>n;
for(int i = 1;i <= n;i++)cin>>a[i];
int l = 1,r = n;
while(l<=r){
if(l == r)
cout<<a[l]<<" ";
else
cout<<a[l]<<" "<<a[r]<<" ";
l++;
r--;
}
cout<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
#if DBG
freopen("input.txt","r",stdin);
#endif
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
B、判断一下头部2、20、202、2020尾部020、20、0、2020即可
#include<bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define debug(x) cout<<#x<<" is "<<x<<endl
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define DBG 0
const int N = 200 + 5;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll LLINF = (1LL<<60);
using namespace std;
const int mod = 998244353;
ll fast_pow(ll a,ll b){
ll ans = 1;
while(b){
if(b&1)ans = (ans * a)%mod;
a = (a * a)%mod;
b>>=1;
}
return (ans%mod);
}
inline int read()
{
int X=0; bool flag=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
if(flag) return X;
return ~(X-1);
}
inline void write(ll X)
{
if(X<0) {X=~(X-1); putchar('-');}
if(X>9) write(X/10);
putchar(X%10+'0');
}
typedef pair<int,int> pii;
char s[N];
void solve(){
int n;
cin>>n;
string s;
cin>>s;
bool f = (s.substr(0,2) == "20" && s.substr(n - 2,n) =="20")||s.substr(0,4) =="2020" || s.substr(n - 4,n) =="2020";
f|= s.substr(0,3) =="202" && s[n-1] == '0';
f|= s[0] =='2' && s.substr(n-3,n) == "020";
if(f)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
#if DBG
freopen("input.txt","r",stdin);
#endif
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
C、搜索一下结果然后输出
#include<bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define debug(x) cout<<#x<<" is "<<x<<endl
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define DBG 0
const int N = 50 + 5;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll LLINF = (1LL<<60);
using namespace std;
const int mod = 998244353;
ll fast_pow(ll a,ll b){
ll ans = 1;
while(b){
if(b&1)ans = (ans * a)%mod;
a = (a * a)%mod;
b>>=1;
}
return (ans%mod);
}
inline int read()
{
int X=0; bool flag=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
if(flag) return X;
return ~(X-1);
}
inline void write(ll X)
{
if(X<0) {X=~(X-1); putchar('-');}
if(X>9) write(X/10);
putchar(X%10+'0');
}
typedef pair<int,int> pii;
int x;
ll minn[N];
void solve(){
cin>>x;
if(minn[x] != LLINF)
cout<<minn[x]<<endl;
else
cout<<-1<<endl;
}
bool vis[10];
void dfs(int sum,ll number){
minn[sum] = min(minn[sum],number);
for(int i = 1;i <= 9;i++){
if(!vis[i]){
vis[i] = 1;
dfs(sum + i,number * 10 + i);
vis[i] = 0;
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
#if DBG
freopen("input.txt","r",stdin);
#endif
int t ;
cin>>t;
for(int i = 0;i < N;i++)
minn[i] = LLINF;
dfs(0,0);
while(t--){
solve();
}
return 0;
}
D、从小到大枚举合并次数,当合并次数确定时每个值也确定了 k = sum /(n - i),check一下能否每个值合并成k即可
#include<bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define debug(x) cout<<#x<<" is "<<x<<endl
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define DBG 0
const int N = 3000 + 5;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll LLINF = (1LL<<60);
using namespace std;
const int mod = 998244353;
ll fast_pow(ll a,ll b){
ll ans = 1;
while(b){
if(b&1)ans = (ans * a)%mod;
a = (a * a)%mod;
b>>=1;
}
return (ans%mod);
}
inline int read()
{
int X=0; bool flag=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
if(flag) return X;
return ~(X-1);
}
inline void write(ll X)
{
if(X<0) {X=~(X-1); putchar('-');}
if(X>9) write(X/10);
putchar(X%10+'0');
}
typedef pair<int,int> pii;
ll a[N];
int n;
bool check(ll k){
ll t = 0;
for(int i =1;i <= n;i++){
if(t + a[i] < k)t+= a[i];
else if(t + a[i] == k)t = 0;
else if(t + a[i] > k)return false;
}
return t== 0;
}
void solve(){
cin>>n;
ll sum = 0;
bool all_same = true;
for(int i = 1;i <= n;i++){
cin>>a[i];
sum += a[i];
if(i > 1 && a[i] != a[i -1 ])all_same = false;
}
if(all_same){
cout<<0<<endl;
return;
}
for(int i =1;i <= n - 1;i++){
if(sum % (n - i) != 0)continue;
ll k = sum /(n - i);
if(check(k)){
cout<<i<<endl;
break;
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
#if DBG
freopen("input.txt","r",stdin);
#endif
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
E1、没想到很好的方法(数学8行QAQ),枚举每个数a[i]为中点,枚举前面和后面的个数,后面用树状数组维护
#include<bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define debug(x) cout<<#x<<" is "<<x<<endl
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define DBG 0
const int N = 2e5 + 5;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll LLINF = (1LL<<60);
using namespace std;
const int mod = 998244353;
ll fast_pow(ll a,ll b){
ll ans = 1;
while(b){
if(b&1)ans = (ans * a)%mod;
a = (a * a)%mod;
b>>=1;
}
return (ans%mod);
}
inline int read()
{
int X=0; bool flag=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
if(flag) return X;
return ~(X-1);
}
inline void write(ll X)
{
if(X<0) {X=~(X-1); putchar('-');}
if(X>9) write(X/10);
putchar(X%10+'0');
}
typedef pair<int,int> pii;
ll a[N],cnt[N],n;
struct BIT {
ll a[N];
int n;
void init(int nn) {
n = nn;
for(int i = 1; i <= n; i++)a[i] = 0;
}
int lowbit(int x) {
return x&(-x);
}
void update(int i,ll x) {
if(i == 0)return;
while(i <= n) {
a[i] += x;
i += lowbit(i);
}
}
ll query(int i) {
ll ans = 0;
while(i > 0) {
ans += a[i];
i -= lowbit(i);
}
return ans;
}
}t;
void solve(){
ll ans = 0;
cin>>n;
t.init(n);
for(int i = 1;i <= n;i++){
cin>>a[i];
cnt[i] = 0;
t.update(a[i],1);
}
for(int i = 1;i <= n;i++){
t.update(a[i],-1);
for(int j = -2;j <= 2;j++){
if(a[i] + j <= 0 || a[i] + j > n)continue;
ll maxk = max(a[i] + j,a[i]);
ll mink = min(a[i] + j,a[i]);
ll ans1 = t.query(min(n,mink + 2));
ll ans2 = t.query(max(0LL,maxk - 3));
ans += cnt[a[i] + j] * (ans1 - ans2);
}
cnt[a[i]]++;
}
cout<<ans<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
#if DBG
freopen("input.txt","r",stdin);
#endif
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
E2、补题
#include<bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define debug(x) cout<<#x<<" is "<<x<<endl
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define DBG 0
const int N = 2e5 + 5;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll LLINF = (1LL<<60);
using namespace std;
const int mod = 1e9 + 7;
ll fast_pow(ll a,ll b){
ll ans = 1;
while(b){
if(b&1)ans = (ans * a)%mod;
a = (a * a)%mod;
b>>=1;
}
return (ans%mod);
}
inline int read()
{
int X=0; bool flag=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
if(flag) return X;
return ~(X-1);
}
inline void write(ll X)
{
if(X<0) {X=~(X-1); putchar('-');}
if(X>9) write(X/10);
putchar(X%10+'0');
}
typedef pair<int,int> pii;
ll fac[N],inv[N],a[N];
void init(){
fac[0] = 1;
for(int i = 1;i < N;i++)
fac[i] =(fac[i - 1] * i)%mod;
inv[N - 1] = fast_pow(fac[N - 1],mod - 2);
for(int i = N - 2;i >= 0;i--)
inv[i] = (inv[i + 1] * (i + 1))%mod;
}
ll c(ll a,ll b){
if(a < b)return 0LL;
ll ans = (((fac[a] * inv[b]) % mod) * inv[a - b])%mod;
return ans;
}
void solve(){
int n,m,k;
cin>> n >> m >> k;
for(int i = 1;i <= n;i++)cin >> a[i];
sort(a + 1,a + 1 + n);
ll ans = 0,l = 1;
for(int r = m;r <= n;r++){
while(a[r] - a[l] > k)l++;
if(r - l + 1 < m)continue;
ans = (ans + c(r - l, m - 1))%mod;
}
cout<<ans<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
#if DBG
freopen("input.txt","r",stdin);
#endif
int t;
init();
cin >> t;
while(t--){
solve();
}
return 0;
}
F、先离散化一下,树状数组t1维护左端点,t2维护右端点,枚举每个区间,求右端点小于当前区间左端点个数和左端点大于当前区间右端点个数,最简单的单点更新区间查询,复杂度O(nlogn)
#include<bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define debug(x) cout<<#x<<" is "<<x<<endl
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define DBG 0
const int N = 2e5 + 5;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll LLINF = (1LL<<60);
using namespace std;
const int mod = 998244353;
ll fast_pow(ll a,ll b){
ll ans = 1;
while(b){
if(b&1)ans = (ans * a)%mod;
a = (a * a)%mod;
b>>=1;
}
return (ans%mod);
}
inline int read()
{
int X=0; bool flag=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
if(flag) return X;
return ~(X-1);
}
inline void write(ll X)
{
if(X<0) {X=~(X-1); putchar('-');}
if(X>9) write(X/10);
putchar(X%10+'0');
}
typedef pair<int,int> pii;
struct BIT {
ll a[N<<2];
int n;
void init(int nn) {
n = nn;
for(int i = 1; i <= n; i++)a[i] = 0;
}
int lowbit(int x) {
return x&(-x);
}
void update(int i,ll x) {
if(i == 0)return;
while(i <= n) {
a[i] += x;
i += lowbit(i);
}
}
ll query(int i) {
ll ans = 0;
while(i > 0) {
ans += a[i];
i -= lowbit(i);
}
return ans;
}
}t1,t2;
map<int,int> hs;
vector<int> point;
vector<pii> inter;
void init(){
hs.clear();
point.clear();
inter.clear();
}
void solve(){
init();
int n;
cin >> n;
for(int i = 1;i <= n;i++) {
int l,r;
cin >> l >> r;
if(hs.count(l) == 0)hs[l] = 1,point.pb(l);
if(hs.count(r) == 0)hs[r] = 1,point.pb(r);
inter.pb(mp(l,r));
}
t1.init(point.size());
t2.init(point.size());
sort(point.begin(),point.end());
for(int i = 0;i < point.size();i++){
hs[point[i]] = i + 1;
}
for(int i = 0;i < inter.size();i++){
int l = inter[i].fi,r = inter[i].se;
t1.update(hs[l],1);
t2.update(hs[r],1);
}
ll ans = n - 1;
for(int i = 0;i < inter.size();i++){
int l = inter[i].fi,r = inter[i].se;
ll ans1 = t2.query(hs[l] - 1);
ll ans2 = t1.query(point.size()) - t1.query(hs[r]);
ans = min(ans1 + ans2,ans);
}
cout<<ans<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
#if DBG
freopen("input.txt","r",stdin);
#endif
int t;
cin >> t;
while(t--)
solve();
return 0;
}