(寒假開黑gym)2018 USP Try-outs
阿新 • • 發佈:2019-02-04
cti 排序。 blog sqrt 警察 oid define 問題 run
layout: post
title: (寒假開黑gym)2018 USP Try-outs
author: "luowentaoaa"
catalog: true
tags:
mathjax: true
- codeforces
傳送門
付隊!
許老師!
B.Aesthetics in poetry (暴力模擬)
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll mod=998244353; const int maxn=1e6+50; const ll inf=1e10; const ll INF = 1000000000; const double eps=1e-5; map<int,int>mp; int a[maxn]; int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); int n; cin>>n; for(int i=0;i<n;i++)cin>>a[i]; bool flag=false; for(int i=2;i<=(n);i++){ if(n%i==0){ mp.clear(); for(int j=0;j<n;j++)mp[a[j]%i]++; if(mp.size()==i){ bool ok=false; for(int j=0;j<i;j++){ if(mp[j]!=n/i){ok=true;break;} } if(!ok){ cout<<i<<endl;return 0; } } } } cout<<-1<<endl; return 0; }
D.Maximizing Advertising (離散化)
題意
在平面內有兩種點,讓你用兩個不相交的矩形把平面覆蓋,讓一個平面的黑點+另一個平面內的百白點數目最多
思路
直接枚舉兩平面的相隔點就行,數據太大無法計數用離散化解決
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll mod=998244353; const int maxn=1e6+50; const ll inf=1e10; const ll INF = 1000000000; const double eps=1e-5; #define bug cout<<"mx="<<mx<<endl; vector<int>x1,x2,y1,y2; vector<int>X; int sum1,sum2; int vis1x[maxn],vis1y[maxn],sum1x[maxn],sum1y[maxn]; int vis2y[maxn],vis2x[maxn],sum2x[maxn],sum2y[maxn]; void get(int id){ sum1x[id]=vis1x[id]; sum1y[id]=vis1y[id]; sum2x[id]=vis2x[id]; sum2y[id]=vis2y[id]; if(id){ sum1x[id]+=sum1x[id-1];sum1y[id]+=sum1y[id-1]; sum2x[id]+=sum2x[id-1];sum2y[id]+=sum2y[id-1]; } } int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); int n; cin>>n; for(int i=1;i<=n;i++){ int x,y;char ch; cin>>x>>y>>ch; if(ch=='b')x1.push_back(x),y1.push_back(y),sum1++; else x2.push_back(x),y2.push_back(y),sum2++; X.push_back(x);X.push_back(y); } sort(X.begin(),X.end()); X.erase(unique(X.begin(),X.end()),X.end()); int sz=X.size(); for(int i=0;i<x1.size();i++){ x1[i]=lower_bound(X.begin(),X.end(),x1[i])-X.begin(); y1[i]=lower_bound(X.begin(),X.end(),y1[i])-X.begin(); } for(int i=0;i<x2.size();i++){ x2[i]=lower_bound(X.begin(),X.end(),x2[i])-X.begin(); y2[i]=lower_bound(X.begin(),X.end(),y2[i])-X.begin(); } int mx=0; for(int i=0;i<sum1;i++){ vis1x[x1[i]]++; vis1y[y1[i]]++; } for(int i=0;i<sum2;i++){ vis2x[x2[i]]++; vis2y[y2[i]]++; } for(int i=0;i<sz;i++){ get(i); mx=max(mx,sum1x[i]+sum2-sum2x[i]); mx=max(mx,sum2x[i]+sum1-sum1x[i]); mx=max(mx,sum1y[i]+sum2-sum2y[i]); mx=max(mx,sum2y[i]+sum1-sum1y[i]); } cout<<mx<<endl; return 0; }
E.Group work (組合數學)
題意
N個學生分組,可以大於等於三個人一組 問分組數量有多少中
思路
Cn0+Cn1+Cn2+Cn3+...+Cnn等於2^n 減去取0個和取1個就是答案
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll mod=998244353; const int maxn=1e6+50; const ll inf=1e10; const ll INF = 1000000000; const double eps=1e-5; #define bug cout<<"mx="<<mx<<endl; int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); int n; cin>>n; cout<<((1LL<<n)-n-1)<<endl; return 0; }
G.Running a penitentiary (區間交集)
題意
有n個警察,第i個警察看管監獄的區間是【Li,Ri】。
有兩種操作:C i l r :把第i個警察的區間變為【l,r】。
?l r :詢問從第l個警察到第r個警察共同看管的區間長度是多少
H. Wine Production (莫隊算法+離散化)
題意
給出N個數,每次查詢一個區間 返回一個K,表示區間有K個數出現了至少K個次
題解
首先用num[x]表示X出現了多少次,cnt[x]表示出現次數為X的個數,
因為N個數有負數所以需要離散化一下, 然後就是莫隊算法瞎搞(模板是從1開始的,我一開始是從0開始的。。)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int maxn=1e5+50;
const ll inf=1e10;
const ll INF = 1000000000;
const double eps=1e-5;
#define bug cout<<"mx="<<mx<<endl;
// ---
// 莫隊算法,可以解決一類靜態,離線區間查詢問題。分成 $\sqrt{x}$ 塊,分塊排序。
// ---
int unit;
int a[maxn];
vector<int> b;
struct query { int L, R, id; };
int ans[maxn];
int num[maxn];///出現次數
int cnt[maxn]; ///出現個數
int tmp;
void add(int x){
num[x]++;cnt[num[x]]++;
if(min(num[x],cnt[num[x]])>tmp)tmp=min(num[x],cnt[num[x]]);
}
void del(int x){
cnt[num[x]]--;
if(num[x]==tmp&&cnt[num[x]]<tmp){
tmp=cnt[num[x]];
}
num[x]--;
}
void solve(query node[], int m)
{
memset(ans, 0, sizeof(ans));
sort(node, node + m, [](query a, query b) {
return a.L / unit < b.L / unit
|| a.L / unit == b.L / unit && a.R < b.R;
});
int L = 0, R = -1;
for (int i = 0; i < m; i++)
{
while (node[i].L < L) add(a[--L]);
while (node[i].L > L) del(a[L++]);
while (node[i].R < R) del(a[R--]);
while (node[i].R > R) add(a[++R]);
ans[node[i].id] = tmp;
}
}
query my[maxn];
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
int n,m;
cin>>n>>m;
unit=sqrt(n);
for(int i=0;i<n;i++)cin>>a[i],b.push_back(a[i]);
sort(b.begin(),b.end());b.erase(unique(b.begin(),b.end()),b.end());
for(int i=0;i<n;i++)a[i]=lower_bound(b.begin(),b.end(),a[i])-b.begin();
for(int i=0;i<m;i++){
cin>>my[i].L>>my[i].R;my[i].id=i;
my[i].L--;my[i].R--;
}
solve(my,m);
for(int i=0;i<m;i++)cout<<ans[i]<<endl;
return 0;
}
I.A story about tea ()
J.Meme Wars (模擬)
思路
就按照題意構造字符串,第一次交超內存了,於是就判斷長度是否大於N在構造
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
const int maxn=1e5+50;
const ll inf=1e10;
const ll INF = 1000000000;
const double eps=1e-5;
#define bug cout<<"mx="<<mx<<endl;
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
string s="a";
int n;cin>>n;
for(char c='b';c<'z'&&s.size()<n;c++)s=s+c+s;cout<<s[n-1];
return 0;
}
(寒假開黑gym)2018 USP Try-outs