@baobaobear
2020-05-03T10:38:43.000000Z
字数 12782
阅读 199
contest
#include<iostream>
#include<cstdio>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef pair<int,int> pii;
typedef double db;
int n,ans;
int main(){
while(cin>>n){
ans=0;
while(n){
ans+=(n&1);
n/=2;
}
printf("%d\n",ans);
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef pair<int,int> pii;
typedef double db;
int t,n;
ll xx[10010],yy[10010],ans;
int main(){
cin>>t;
while(t--){
cin>>n;
rep(i,1,n){
scanf("%lld",xx+i);
}
rep(i,1,n){
scanf("%lld",yy+i);
}
sort(xx+1,xx+1+n);
sort(yy+1,yy+1+n);
ans=0;
rep(i,1,n){
ans+=(xx[i]*yy[i]);
}
printf("%lld\n",ans);
}
return 0;
}
#include<stdio.h>
#define LL long long
int a[2000010] = { 0 };
int main(void) {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
a[i] = i;
int coun1 = 0, coun2 = 0, flag = 0;
for (int i = 1; i <= n + coun2; i++) {
coun1++;
if (coun1 == 1 && flag == 0) {
flag = 1;
printf("%d", a[i]);
}
else if (coun1 == 1 && flag)
printf(" %d", a[i]);
if (coun1 == 2) {
coun2++;
a[n + coun2] = a[i];
coun1 = 0;
}
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef pair<int,int> pii;
typedef double db;
int n,tmp,s[50010];
int mx[600010];
int main(){
cin>>n;
rep(i,1,n){
cin>>tmp;
s[i]=s[i-1]+tmp;
}
memset(mx,-1,sizeof(mx));
rep(i,0,n){
s[i]=2*s[i]-i+50010;
mx[s[i]]=max(mx[s[i]],i);
}
int ans=0;
rep(i,1,n){
if(mx[s[i-1]]!=-1){
ans=max(ans,mx[s[i-1]]-i+1);
}
}
printf("%d\n",ans);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <list>
#include <limits>
#include <set>
#include <map>
#include <functional>
#include <stdint.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
using namespace std;
typedef long long ll;
#define io _g_io
#define nl _g_pt_nl
#define repi(i,b,e) for (int i = (b), _ = (e); i < _; ++i)
#define rep(i,b,e) for (int i = (b), _ = (e); i <= _; ++i)
#define repr(i,b,e) for (int i = (b), _ = (e); i >= _; --i)
static int sc_ret = 0;
struct pt_nl {} _g_pt_nl;
struct _sp
{
_sp& operator >> (char& v) { sc_ret = scanf(" %c", &v); return *this; }
_sp& operator >> (int& v) { sc_ret = scanf("%d", &v); return *this; }
_sp& operator >> (unsigned& v) { sc_ret = scanf("%u", &v); return *this; }
_sp& operator >> (double& v) { sc_ret = scanf("%lf", &v); return *this; }
_sp& operator >> (char* v) { sc_ret = scanf("%s", v); return *this; }
_sp& operator >> (string& v) { sc_ret = (bool)(cin >> v); return *this; }
_sp& operator >> (ll& v) { sc_ret = read(v); return *this; }
_sp& ch(char& v) { v = sc_ret = getchar(); return *this; }
_sp& gets(char* v) { sc_ret = fgets(v, INT_MAX, stdin) != 0; v[strlen(v) - 1] = 0; return *this; }
operator bool() const { return sc_ret > 0; }
template <typename T>
int read(T& v)
{
T k = 1; v = 0;
int c = getchar();
while (c < '0' || c > '9')
{
if (c == '-') k = 0;
c = getchar();
}
while (c >= '0' && c <= '9') v = (v << 3) + (v << 1) + (c - 48), c = getchar();
if (k == 0) v = -v;
return c;
}
_sp& ln() { putchar('\n'); return *this; }
_sp& operator<<(const pt_nl& nl) { putchar('\n'); return *this; }
_sp& operator<<(char v) { putchar(v); return *this; }
_sp& operator<<(int v) { printf("%d", v); return *this; }
_sp& operator<<(unsigned v) { printf("%u", v); return *this; }
_sp& operator<<(double v) { printf("%.2f", v); return *this; }
_sp& operator()(const char* fmt, double v) { printf(fmt, v); return *this; }
_sp& operator<<(const char* v) { printf("%s", v); return *this; }
_sp& operator<<(string v) { printf("%s", v.c_str()); return *this; }
_sp& operator<<(ll v) { write(v); return *this; }
void flush() { fflush(stdout); }
template <typename T>
void write(T v)
{
int cnt = 0; char c[23];
if (v == 0) { putchar('0'); return; }
if (v < 0) putchar('-'), v = -v;
while (v) c[++cnt] = (v % 10) + 48, v /= 10;
while (cnt > 0) putchar(c[cnt--]);
}
template <typename T>
void ln(T* arr, int size, char split = ' ')
{
if (size > 0)
{
(*this) << arr[0];
for (int i = 1; i < size; ++i)
putchar(split), (*this) << arr[i];
}
putchar('\n');
}
}_g_io;
const int inf = 0x3f3f3f3f;
const int mod1e9 = 1000000007;
const int mod998 = 998244353;
const int mod = mod1e9;
const int maxn = 2000000 + 10;
void solve()
{
int n, j = 0, lastsum = 0, lsum = 0;
int a[200];
ll sum = 0;
io >> n;
rep(i, 1, n) io >> a[i];
sort(a + 1, a + n + 1);
rep(i, 1, n)
{
lsum += i - 1;
lastsum += a[i];
if (lastsum == lsum)
{
sum += (n - j) * (i - j);
j = i;
}
}
io << sum << nl;
}
int main(void)
{
int t;
solve();
return 0;
}
#include <iostream>
#include <string.h>
using namespace std;
typedef long long ll;
int n,m;
ll dp[15][1<<11],temp;
void dfs(int i,int p,int k)
{
if(k>=m)
{
dp[i][p]+=temp;
return;
}
dfs(i,p,k+1);
if(k<=m-2 && !(p&1<<k) && !(p&1<<k+1))
dfs(i,p|1<<k|1<<k+1,k+2);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0) break;
memset(dp,0,sizeof(dp));
temp = 1;
dfs(1,0,0);
for(int i = 2; i<=n; i++)
{
for(int j = 0; j<1<<m; j++)
{
if(dp[i-1][j]) temp = dp[i-1][j];
else
continue;
dfs(i,~j&((1<<m)-1),0);
}
}
printf("%lld\n",dp[n][(1<<m)-1]);
}
return 0;
}
#pragma GCC optimize("Ofast","inline")
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define OUTS() printf("%lld\n", COUNT)
#define work() for(long long i = 0; i <= 8; i++) (COUNT += f[NOW][i][0]) %= MOD
#define INS() scanf("%lld", &n),scanf("%d", &k)
#define MAIN() (f[NOW][j + h][(g + (i - 1)*h) % k] += f[NOW^1][j][g] * DO(arr[i - 1] + h - 1, h) % MOD) %= MOD
const long long MOD = 1e9 + 7;
bool AKIOI =true;
long long f[2][9][710];
long long COUNT = 0;
long long arr[710], arr2[10];
long long k, CNT, p[1500];
long long arr3[710];
long long read(){
long long ans=0,sign=1;
char ch=getchar();
while(isdigit(ch)){
ans=(ans<<1)+(ans<<3)+(ch^48),ch=getchar();
}
return ans*sign;
}
long long qpow(long long a, long long k) {
long long COUNT = 1;
while(k) {
if(k & 1) (COUNT *= a) %= MOD;
(a *= a) %= MOD; k /= 2;
} return COUNT;
}
long long DO(long long n, long long m) {
long long COUNT = 1;
for(long long i = n; i >= n - m + 1; i--) (COUNT *= i) %= MOD;
(COUNT *= arr2[m]) %= MOD;
return COUNT;
}
signed main(void) {
long long n;
INS();
long long num = 0; long long pos = -1;
for(long long i = 1; i <= n; i++) {
num = (num * 10 + 1) % k;
if(arr3[num]) {pos = i; break;}
arr3[num] = i;
p[++CNT] = num;
} long long Q;
arr2[0] = 1; for(long long i = 1; i <= 8; i++) arr2[i] = arr2[i - 1] * i % MOD;
for(long long i = 1; i <= 8; i++) arr2[i] = qpow(arr2[i], MOD - 2);
if(pos == -1) {
for(long long i = 1; i <= CNT; i++) arr[p[i]]++;
Q = p[CNT];
}
else {
for(long long i = 1; i < arr3[num]; i++) arr[p[i]]++;
n -= arr3[num] - 1;
long long dd = CNT - arr3[num] + 1;
for(long long i = arr3[num]; i <= CNT; i++) (arr[p[i]] += (long long)n / dd) %= MOD;
n %= dd;
for(long long i = 0; i < n; i++) (arr[p[i + arr3[num]]] += 1) %= MOD;
if(n == 0) n = dd;
Q = p[n + arr3[num] - 1];
}
long long NOW = 0; f[0][0][Q] = 1;
for(long long i = 1; i <= k; i++) {
NOW ^= 1;
for(long long j = 0; j <= 8; j++) for(long long u = 0; u < k; u++) f[NOW][j][u] = f[NOW ^ 1][j][u];
for(long long j = 0; j < 8; j++) {
for(long long g = 0; g < k; g++) if(f[NOW ^ 1][j][g]){
for(long long h = 1; h <= 8 - j; h++) {
MAIN();
}
}
}
}
work();
OUTS();
return 0;
//AKIOI
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+2;
stack<int>s;
ll ans,sum[maxn],l[maxn],r[maxn];
vector<int>v[maxn];
int a[maxn];
int query(ll x,int l,int r)
{
return upper_bound(v[x].begin(),v[x].end(),r)-lower_bound(v[x].begin(),v[x].end(),l);
}
void slove()
{
int n,k;
scanf("%d %d",&n,&k);
v[0].push_back(0);
for(int i=1;i<=n;++i) {
scanf("%d",&a[i]);
sum[i]=(sum[i-1]+a[i])%k;
v[sum[i]].push_back(i);
}
a[n+1]=1e9+7;
s.push(0);
for(int i=1;i<=n;++i)
{
while(s.size()>1&&a[s.top()]<a[i]) s.pop();
l[i]=s.top();
s.push(i);
}
while(!s.empty()) s.pop();
s.push(n+1);
for(int i=n;i>=1;--i)
{
while(s.size()>1&&a[s.top()]<=a[i]) s.pop();
r[i]=s.top();
s.push(i);
}
for(int i=1;i<=n;++i) a[i]%=k;
for(int i=1;i<=n;++i)
if(i-l[i]<r[i]-i)
for(int j=l[i]+1;j<=i;++j) ans+=query((sum[j-1]+a[i])%k,i,r[i]-1);
else for(int j=i;j<r[i];++j) ans+=query((sum[j]-a[i]+k)%k,l[i],i-1);
printf("%lld\n",ans-n);
}
int main()
{
slove();
}
#include <cstdio>
#include <algorithm>
#include <vector>
#include <iostream>
#include <map>
#include <queue>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <set>
using namespace std;
const int inf = (1 << 30);
typedef long long ll;
const int maxn = 1e6 + 5;
vector<int> vec;
struct node
{
int ls, rs, w;
int size, fact;
bool exist;
} tr[maxn];
int cnt, rt;
void newnode(int &now, int w)
{
now = ++cnt;
tr[now].w = w, tr[now].size = tr[now].fact = 1;
tr[now].exist = true;
}
void pushup(int now)
{
tr[now].size = tr[tr[now].ls].size + tr[tr[now].rs].size + 1;
}
void pushfp(int now)
{
tr[now].fact = tr[tr[now].ls].fact + tr[tr[now].rs].fact + 1;
}
bool judge(int now)
{
if (max(tr[tr[now].ls].size, tr[tr[now].rs].size) > (tr[now].size * 0.75))
return true;
if (tr[now].size - tr[now].fact > tr[now].size * 0.3)
return true;
return false;
}
void ldm(int now)
{
if (!now)
return;
ldm(tr[now].ls);
vec.push_back(now);
ldm(tr[now].rs);
}
void cre(int &now, int L, int R)
{
if (L == R)
{
now = vec[L];
tr[now].ls = tr[now].rs = 0;
tr[now].size = tr[now].fact = 1;
return;
}
int mid = L + R >> 1;
while (tr[vec[mid]].w == tr[vec[mid - 1]].w)
mid--;
now = vec[mid];
if (L < mid)
cre(tr[now].ls, L, mid - 1);
}
void rebuild(int &now)
{
}
void update(int now, int en)
{
if (now == en)
return;
if (tr[now].w > tr[en].w)
update(tr[now].ls, en);
else
update(tr[now].rs, en);
pushup(now);
}
void check(int &now, int en)
{
if (now == en)
return;
if (judge(now))
{
rebuild(now);
update(rt, now);
return;
}
if (tr[now].w > tr[en].w)
check(tr[now].ls, en);
else
check(tr[now].rs, en);
}
void inser(int &now, int w)
{
if (!now)
{
newnode(now, w);
check(rt, now);
return;
}
tr[now].size++, tr[now].fact++;
if (w < tr[now].w)
inser(tr[now].ls, w);
else
inser(tr[now].rs, w);
}
void dele(int now, int w)
{
if (tr[now].exist && tr[now].w == w)
{
tr[now].exist = false;
tr[now].fact--;
check(rt, now);
return;
}
tr[now].fact--;
if (w < tr[now].w)
dele(tr[now].ls, w);
else
dele(tr[now].rs, w);
}
int a[maxn], b[maxn], sum[maxn];
ll gcd(ll a, ll b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
ll ext_gcd(ll &a, ll &b, ll n, ll m)
{
if (m == 0)
{
a = 1;
b = 0;
return n;
}
ll d = ext_gcd(b, a, m, n % m);
b -= n / m * a;
return d;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
ll a, b, c;
while (cin >> a >> b >> c)
{
if (!a && !b)
{
if (!c)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
else if (!a)
{
if ((c % b) == 0)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
else if (!b)
{
if ((c % a) == 0)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
else
{
ll x, y, g;
g = ext_gcd(x, y, a, b);
if ((c % g) != 0)
{
cout << "NO" << endl;
continue;
}
ll x0 = b / g;
ll y0 = a / g;
x = ((c / g % x0) * (x % x0) % x0 + x0) % x0;
y = (c - x * a) / b;
bool fla = false;
while (y > 0)
{
if (gcd(x, y) == 1)
{
fla = true;
break;
}
x += x0;
y -= y0;
}
if (fla)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
}
}
#include <bits/stdc++.h>
const int maxn=700;
using namespace std;
char s[maxn];
int tot=0,p[maxn],h[maxn],g[maxn][maxn],vis[maxn],sum[maxn];
double d[maxn];
vector<int>v[maxn],v1;
int turn(char a,char b)
{
return (a-'a')*26+(b-'a')+1;
}
bool spfa(int s,double mid)
{
queue<int>q;
for(int i=0;i<maxn;++i) vis[i]=d[i]=sum[i]=0;
q.push(s);
vis[s]=sum[s]=1;
while(!q.empty())
{
int top=q.front();
q.pop();
vis[top]=0;
for(int t:v[top])
{
double x=g[top][t]-mid;
if(d[top]+x>d[t])
{
d[t]=d[top]+x;
if(!vis[t])
{
sum[t]++;
if(sum[t]>tot) return true;
q.push(t);
vis[t]=1;
}
}
}
}
return false;
}
int check(double mid)
{
for(int i:v1)
if(spfa(i,mid)) return 1;
return 0;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
v1.clear();
tot=0;
for(int i=0;i<maxn;++i) v[i].clear(),p[i]=h[i]=0;
for(int i=0;i<maxn;++i) for(int j=0;j<maxn;++j) g[i][j]=0;
for(int i=1;i<=n;++i)
{
scanf("%s",s+1);
int len=strlen(s+1);
if(len<2) continue;
int x=turn(s[1],s[2]),y=turn(s[len-1],s[len]);
if(!g[x][y]) v[x].push_back(y);//存图
g[x][y]=max(g[x][y],len);//存边权
if(!p[x]) v1.push_back(x);//记录起点
p[x]=1;
if(!h[x]) tot++;//记录点的总数
if(!h[y]) tot++;
h[x]=h[y]=1;
}
double l=0,r=1000,mid;
while(r-l>1e-3)
{
mid=(l+r)/2;
if(check(mid)) l=mid;
else r=mid;
}
if(l<1e-6) printf("No solution.\n");
else printf("%.2lf\n",l);
}
}
/******************************
非正式参赛选手
please skip it.
******************************/
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 2e5 + 5;
int ch[N][2], fa[N], size[N];
bool rev[N];
#define lc ch[x][0]
#define rc ch[x][1]
inline void pushup(int x) {
size[x] = size[lc] + size[rc] + 1;
}
inline void setRev(int x) {
swap(lc, rc), rev[x] ^= 1;
}
inline void pushdown(int x) {
if (rev[x]) {
if (lc) setRev(lc);
if (rc) setRev(rc);
rev[x] = 0;
}
}
inline bool isRoot(int x) {
return x != ch[fa[x]][0] && x != ch[fa[x]][1];
}
inline int getc(int x) {
return x == ch[fa[x]][1];
}
inline void rotate(int x) {
int y = fa[x], z = fa[y];
int k = getc(x), w = ch[x][!k];
if (!isRoot(y)) ch[z][getc(y)] = x;
ch[x][!k] = y, ch[y][k] = w;
if (w) fa[w] = y;
fa[y] = x, fa[x] = z, pushup(y);
}
inline void pushdownAll(int x) {
if (!isRoot(x)) pushdownAll(fa[x]);
pushdown(x);
}
inline void splay(int x) {
pushdownAll(x);
for (register int y = fa[x]; !isRoot(x); rotate(x), y = fa[x])
if (!isRoot(y)) rotate(getc(x) != getc(y) ? x : y);
pushup(x);
}
inline void access(int x) {
for (register int y = 0; x; x = fa[y = x])
splay(x), rc = y, pushup(x);
}
inline void makeRoot(int x) {
access(x), splay(x), setRev(x);
}
inline void split(int x, int y) {
makeRoot(x), access(y), splay(y);
}
inline int findRoot(int x) {
access(x), splay(x), pushdown(x);
while (lc) pushdown(x = lc);
return splay(x), x;
}
inline void link(int x, int y) {
if (makeRoot(x), findRoot(y) != x) fa[x] = y;
}
inline void cut(int x, int y) {
makeRoot(x);
if (findRoot(y) == x && fa[y] == x && !ch[y][0])
fa[y] = rc = 0, pushup(x);
}
int n, q;
inline int getPre() {
int x = ch[n + 1][0];
while (pushdown(x), rc) x = rc;
return x;
}
int nxt[N];
signed main() {
ios::sync_with_stdio(false);
cin >> n >> q;
for (register int i = 1; i <= n + 1; i++)
size[i] = 1;
for (register int x, i = 1; i <= n; i++) {
cin >> nxt[i], x = nxt[i];
if (i + x <= n) link(i, i + x);
else link(i, n + 1);
}
for (; q; --q) {
int cmd, pos, val;
cin >> cmd >> pos;
if (cmd == 1) {
split(pos, n + 1);
cout << getPre() << ' ';
cout << size[n + 1] - 1 << endl;
} else {
cin >> val;
cut(pos, pos + nxt[pos] <= n ? pos + nxt[pos] : n + 1);
link(pos, pos + val <= n ? pos + val : n + 1);
nxt[pos] = val;
}
}
}