备用库
Komorebi_shine · · 个人记录
test3
//path
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 200010;
const int M = 5000010;
const int B = 17;
int _w;
int read() {
int x = 0, ch;
while( isspace(ch = getchar()) );
do x = x * 10 + ch - '0';
while( isdigit(ch = getchar()) );
return x;
}
int n, m, C, s, t;
namespace G {
int head[N], nxt[M], to[M], len[M], eid;
void init() {
eid = 0;
memset(head, -1, sizeof head);
}
void link( int u, int v, int w ) {
len[eid] = w, to[eid] = v;
nxt[eid] = head[u], head[u] = eid++;
}
}
struct Node {
int u, d;
Node() {}
Node( int u, int d ):
u(u), d(d) {}
bool operator<( const Node &rhs ) const {
return d > rhs.d;
}
};
priority_queue<Node> pq;
int dis[N], done[N];
void dijkstra() {
using namespace G;
memset(dis, 0x3f, sizeof dis);
dis[s] = 0, pq.push( Node(s, 0) );
while( !pq.empty() ) {
Node o = pq.top(); pq.pop();
int u = o.u;
if( done[u] ) continue;
done[u] = 1;
for( int i = head[u]; ~i; i = nxt[i] ) {
int v = to[i], w = len[i];
if( dis[u] + w < dis[v] ) {
dis[v] = dis[u] + w;
pq.push( Node(v, dis[v]) );
}
}
}
printf( "%d\n", dis[t] );
}
int main() {
freopen("path.in", "r", stdin);
freopen("path.out", "w", stdout);
n = read(), m = read(), C = read();
G::init();
for( int i = 0; i < m; ++i ) {
int u = read(), v = read(), w = read();
G::link(u, v, w);
}
for( int i = 0; i < (1<<B); ++i )
for( int j = 0; j < B; ++j ) {
int v = i ^ (1<<j);
G::link(i, v, (1<<j)*C);
}
s = read(), t = read();
dijkstra();
return 0;
}
//interval
#include <cstring>
#include <algorithm>
#include <cstdio>
typedef long long ll;
const int N = 200010;
const ll INFLL = 3e18;
int _w;
int n, k, a[N];
ll ans;
int right[N];
void prelude() {
for( int i = n; i >= 1; --i )
if( a[i] == 1 )
right[i] = a[i+1] == 1 ? right[i+1] : i;
}
bool check( ll a, ll b ) {
return 1.0 * a * b <= INFLL;
}
ll solve( int L ) {
ll p = 1, s = 0, ans = 0;
for( int i = L; i <= n; ++i )
if( a[i] == 1 ) {
int R = right[i];
int cnt = R-i+1;
if( p % k == 0 ) {
ll tmp = p/k-s;
if( tmp >= 1 && tmp <= cnt )
++ans;
}
i = R, s += cnt;
} else {
if( !check(p, a[i]) ) break;
p *= a[i], s += a[i];
if( p % k == 0 && p/k == s )
++ans;
}
return ans;
}
int main() {
freopen("interval.in", "r", stdin);
freopen("interval.out", "w", stdout);
_w = scanf( "%d%d", &n, &k );
for( int i = 1; i <= n; ++i )
_w = scanf( "%d", a+i );
prelude();
for( int i = 1; i <= n; ++i )
ans += solve(i);
printf( "%lld\n", ans );
return 0;
}
//group
#include <iostream>
#include <cstdio>
const int N = 505;
const int M = N * N;
bool vis[N] , col[N] , f[N];
int tov[M] , nxt[M];
bool want[N][N];
int last[N];
int cnt[2];
int n , m , tot , ans;
int iabs(int x){return x > 0 ? x : -x;}
void insert(int x , int y){tov[++ tot] = y , nxt[tot] = last[x] , last[x] = tot;}
void dfs(int x , bool c = 0)
{
if (vis[x])
{
if (col[x] ^ c) ans = -1;
return;
}
vis[x] = 1 , ++ cnt[col[x] = c];
for (int i = last[x];~ans && i;i = nxt[i]) dfs(tov[i] , c ^ 1);
}
int main()
{
freopen("group.in" , "r" , stdin) , freopen("group.out" , "w" , stdout);
scanf("%d%d" , &n , &m);
for (int i = 1 , x , y;i <= m;++ i) scanf("%d%d" , &x , &y) , want[x][y] = want[y][x] = 1;
for (int x = 1;x < n;++ x)
for (int y = x + 1;y <= n;++ y)
if (!want[x][y] || !want[y][x])
insert(x , y) , insert(y , x);
ans = n , f[0] = 1;
for (int x = 1;~ans && x <= n;++ x)
if (!vis[x])
{
cnt[0] = cnt[1] = 0 , dfs(x);
for (int i = n;i >= 0;-- i) f[i] = (i >= cnt[0] ? f[i - cnt[0]] : 0) | (i >= cnt[1] ? f[i - cnt[1]]: 0);
}
for (int i = 0;i <= n;++ i) if (f[i]) ans = std::min(ans , iabs(n - (i << 1)));
if (~ans) printf("%d\n" , ans);
else printf("No Answer\n");
fclose(stdin) , fclose(stdout);
return 0;
}
test4
//pyramid
#include <iostream>
#include <cstdio>
const int N = 1005;
std::pair<std::pair<int , int> , int> smin[N][N];
std::pair<std::pair<int , int> , int> que[N];
int num[N][N] , sum[N][N];
int head , tail , n , m , row , col , row_ , col_ , ans;
std::pair<std::pair<int , int> , std::pair<int , int> > loc;
int calc_sum(int x , int y , int r , int c){return sum[x + r - 1][y + c - 1] - sum[x - 1][y + c - 1] - sum[x + r - 1][y - 1] + sum[x - 1][y - 1];}
std::pair<int , int> swift(std::pair<int , int> pr){return std::make_pair(pr.second , pr.first);}
void add(std::pair<std::pair<int , int> , int> pr)
{
for (;head <= tail && que[tail].second >= pr.second;-- tail);
que[++ tail] = pr;
}
std::pair<std::pair<int , int> , int> query(int lim)
{
for (;head <= tail && que[head].first.first < lim;++ head);
return que[head];
}
void update(std::pair<int , int> loc1 , std::pair<std::pair<int , int> , int> ret)
{
int cur = calc_sum(loc1.first , loc1.second , row , col) - ret.second;
if (cur > ans) ans = cur , loc.first = loc1 , loc.second = swift(ret.first);
}
int main()
{
freopen("pyramid.in" , "r" , stdin) , freopen("pyramid.out" , "w" , stdout);
scanf("%d%d%d%d%d%d" , &m , &n , &col , &row , &col_ , &row_);
for (int i = 1;i <= n;++ i)
for (int j = 1;j <= m;++ j)
scanf("%d" , &num[i][j]) , sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + num[i][j] , smin[i][j] = std::make_pair(std::make_pair(i , j) , 200000000);
for (int j = 1 , width = row - 2 - row_ + 1;j <= m - col_ + 1;++ j)
{
head = 1 , tail = 0;
for (int i = 1;i < width;++ i) add(std::make_pair(std::make_pair(i , j) , calc_sum(i , j , row_ , col_)));
for (int i = width;i <= n - row_ + 1;++ i)
{
add(std::make_pair(std::make_pair(i , j) , calc_sum(i , j , row_ , col_)));
smin[i - width + 1][j] = query(i - width + 1);
}
}
for (int i = 1 , width = col - 2 - col_ + 1;i <= n - row + 1;++ i)
{
head = 1 , tail = 0;
for (int j = 2;j < width + 1;++ j) add(std::make_pair(swift(smin[i + 1][j].first) , smin[i + 1][j].second));
for (int j = col , j_;j <= m;++ j)
{
j_ = j - col + 1 + width;
add(std::make_pair(swift(smin[i + 1][j_].first) , smin[i + 1][j_].second));
update(std::make_pair(i , j - col + 1) , query(j - col + 2));
}
}
printf("%d\n" , ans);
// printf("%d %d\n" , loc.first.second , loc.first.first);
// printf("%d %d\n" , loc.second.second , loc.second.first);
fclose(stdin) , fclose(stdout);
return 0;
}
//forest
#include <utility>
#include <cstdio>
const int P = 1000000007;
const int N = 100005;
const int M = N << 1;
const int LGN = 17;
typedef std::pair<int , int> seg;
int up[N] , LOG[N] , fa[N] , val[N] , last[N] , ans[N] , depth[N] , del[N];
int tov[M] , nxt[M];
seg res[N] , edg[N];
int anc[N][LGN];
int n , tot;
int quick_power(int x , int y)
{
int ret = 1;
for (;y;y >>= 1 , x = 1ll * x * x % P) if (y & 1) ret = 1ll * ret * x % P;
return ret;
}
int inv(int x){return quick_power(x , P - 2);}
void link(int x , int y){tov[++ tot] = y , nxt[tot] = last[x] , last[x] = tot;}
void dfs(int x)
{
for (int i = last[x] , y;i;i = nxt[i])
if ((y = tov[i]) != anc[x][0])
anc[y][0] = x , up[y] = up[x] + val[y] , depth[y] = depth[x] + 1 , dfs(y);
}
void pre()
{
LOG[1] = 0;
for (int i = 2;i <= n;++ i) LOG[i] = LOG[i - 1] + (1 << LOG[i - 1] + 1 == i);
for (int i = 1;i <= LOG[n];++ i)
for (int x = 1;x <= n;++ x)
anc[x][i] = anc[anc[x][i - 1]][i - 1];
}
int adjust(int x , int d)
{
for (int i = LOG[depth[x]];i >= 0;-- i)
if (depth[anc[x][i]] >= d) x = anc[x][i];
return x;
}
int lca(int x , int y)
{
if (depth[x] > depth[y]) std::swap(x , y);
y = adjust(y , depth[x]);
if (x == y) return x;
for (int i = LOG[depth[x]];i >= 0;-- i)
if (anc[x][i] != anc[y][i])
x = anc[x][i] , y = anc[y][i];
return anc[x][0];
}
int dist(int x , int y)
{
int z = lca(x , y);
return up[x] + up[y] - up[z] - up[anc[z][0]];
}
int dist(const seg &l){return dist(l.first , l.second);}
int getfather(int son){return fa[son] == son ? son : fa[son] = getfather(fa[son]);}
void update(seg &l , int &d , const seg &l_)
{
int d_ = dist(l_);
if (d < d_) d = d_ , l = l_;
}
void merge(int x , int y)
{
x = getfather(x) , y = getfather(y);
if (x == y) return;
fa[y] = x;int d = dist(res[x]);
int u = res[x].first , v = res[x].second;
update(res[x] , d , res[y]);
update(res[x] , d , std::make_pair(u , res[y].first));
update(res[x] , d , std::make_pair(u , res[y].second));
update(res[x] , d , std::make_pair(v , res[y].first));
update(res[x] , d , std::make_pair(v , res[y].second));
}
int main()
{
freopen("forest.in" , "r" , stdin) , freopen("forest.out" , "w" , stdout);
scanf("%d" , &n);
int cur = 1;
for (int x = 1;x <= n;++ x) scanf("%d" , &val[x]) , fa[x] = x , res[x] = std::make_pair(x , x) , cur = 1ll * cur * val[x] % P;
for (int i = 1 , x , y;i < n;++ i) scanf("%d%d" , &x , &y) , link(x , y) , link(y , x) , edg[i] = std::make_pair(x , y);
depth[1] = 1 , up[1] = val[1] , dfs(1) , pre();
for (int i = 1;i < n;++ i) scanf("%d" , &del[i]);
for (int i = n - 1 , x , y;i >= 1;-- i)
{
ans[i] = cur , x = getfather(edg[del[i]].first) , y = getfather(edg[del[i]].second);
cur = 1ll * cur * inv(dist(res[x])) % P * inv(dist(res[y])) % P;
merge(x , y) , cur = 1ll * cur * dist(res[getfather(x)]) % P;
}
ans[0] = cur;
for (int i = 0;i < n;++ i) printf("%d\n" , ans[i]);
fclose(stdin) , fclose(stdout);
return 0;
}
//guess
#include <algorithm>
#include <iostream>
#include <cstdio>
const int N = 1005;
const int M = N * N;
struct edge
{
int x , y , len;
inline edge(int x_ = 0 , int y_ = 0 , int len_ = 0) : x(x_) , y(y_) , len(len_) {}
inline bool operator<(const edge e)const{return len < e.len;}
}e[M];
int fa[N];
int n , m , ans;
int getfather(int son){return fa[son] == son? son : fa[son] = getfather(fa[son]);}
void Kruskal()
{
std::sort(e + 1 , e + 1 + m);
ans = 0;
for (int i = 1 , fx , fy;i <= m;++ i)
{
fx = getfather(e[i].x) , fy = getfather(e[i].y);
if (fx == fy) continue;
fa[fy] = fx , ans += e[i].len;
}
}
int main()
{
freopen("guess.in" , "r" , stdin) , freopen("guess.out" , "w" , stdout);
scanf("%d" , &n);
for (int i = 1;i <= n;++ i)
for (int j = i , x;j <= n;++ j)
scanf("%d" , &x) , e[++ m] = edge(i - 1 , j , x);
for (int x = 0;x <= n;++ x) fa[x] = x;
Kruskal() , printf("%d\n" , ans);
fclose(stdin) , fclose(stdout);
return 0;
}
test5
//sort
#include <bits/stdc++.h>
const int N = 100005;
const int C = 26;
struct data
{
int cnt[C];
data(){for (int c = 0;c < C;++ c) cnt[c] = 0;}
data operator+(const data &d)
{
data ret;
for (int c = 0;c < C;++ c) ret.cnt[c] = cnt[c] + d.cnt[c];
return ret;
}
data &operator+=(const data &d)
{
for (int c = 0;c < C;++ c) cnt[c] += d.cnt[c];
return *this;
}
};
char tg[N << 2];
data t[N << 2];
char str[N];
int n , q;
void build(int x , int l , int r)
{
tg[x] = '#';
if (l == r)
{
++ t[x].cnt[str[l] - 'a'];
return;
}
int mid = l + r >> 1;
build(x << 1 , l , mid) , build(x << 1 | 1 , mid + 1 , r) , t[x] = t[x << 1] + t[x << 1 | 1];
}
void fillc(int x , int l , int r , char tg_)
{
tg[x] = tg_;
for (int c = 0;c < C;++ c) t[x].cnt[c] = (c == tg_ - 'a') * (r - l + 1);
}
void clear(int x , int l , int r)
{
if (l == r) return;
int mid = l + r >> 1;
if (tg[x] != '#')
{
fillc(x << 1 , l , mid , tg[x]) , fillc(x << 1 | 1 , mid + 1 , r , tg[x]);
tg[x] = '#';
}
}
void count(int x , int st , int en , int l , int r , data &d)
{
if (st > en) return;
if (st == l && en == r)
{
d += t[x];
return;
}
clear(x , l , r);
int mid = l + r >> 1;
if (en <= mid) count(x << 1 , st , en , l , mid , d);
else if (mid + 1 <= st) count(x << 1 | 1 , st , en , mid + 1 , r , d);
else count(x << 1 , st , mid , l , mid , d) , count(x << 1 | 1 , mid + 1 , en , mid + 1 , r , d);
}
void fillc(int x , int st , int en , int l , int r , int c)
{
if (st > en) return;
if (st == l && en == r)
{
fillc(x , l , r , 'a' + c);
return;
}
clear(x , l , r);
int mid = l + r >> 1;
if (en <= mid) fillc(x << 1 , st , en , l , mid , c);
else if (mid + 1 <= st) fillc(x << 1 | 1 , st , en , mid + 1 , r , c);
else fillc(x << 1 , st , mid , l , mid , c) , fillc(x << 1 | 1 , mid + 1 , en , mid + 1 , r , c);
t[x] = t[x << 1] + t[x << 1 | 1];
}
void display(int x , int l , int r)
{
if (l == r)
{
for (int c = 0;c < C;++ c)
if (t[x].cnt[c]) putchar('a' + c);
return;
}
clear(x , l , r);
int mid = l + r >> 1;
display(x << 1 , l , mid) , display(x << 1 | 1 , mid + 1 , r);
}
int main()
{
freopen("sort.in" , "r" , stdin) , freopen("sort.out" , "w" , stdout);
scanf("%d%d" , &n , &q);
scanf("%s" , str + 1);
build(1 , 1 , n);
for (int i = 1 , l , r , x;i <= q;++ i)
{
scanf("%d%d%d" , &l , &r , &x);
data tmp;
count(1 , l , r , 1 , n , tmp);
if (x == 1)
for (int c = 0;c < C;++ c)
{
fillc(1 , l , l + tmp.cnt[c] - 1 , 1 , n , c);
l += tmp.cnt[c];
}
else
for (int c = 0;c < C;++ c)
{
fillc(1 , r - tmp.cnt[c] + 1 , r , 1 , n , c);
r -= tmp.cnt[c];
}
}
display(1 , 1 , n) , putchar('\n');
fclose(stdin) , fclose(stdout);
return 0;
}
//friend
#include <iostream>
#include <cstdio>
#include <cctype>
using namespace std;
typedef long long LL;
int read()
{
int x=0,f=1;
char ch=getchar();
while (!isdigit(ch))
{
if (ch=='-')
f=-1;
ch=getchar();
}
while (isdigit(ch))
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
const int N=300500;
struct D
{
int mx,l,r;
LL sum;
};
D operator+(D x,D y)
{
D ret;
ret.sum=x.sum+y.sum;
ret.l=x.l,ret.r=y.r;
ret.mx=y.mx;
return ret;
}
struct segment_tree
{
int tag[N<<2];
D v[N<<2];
void S(int x,int y)
{
if (tag[x])
tag[x]=min(tag[x],y);
else
tag[x]=y;
v[x].sum=1ll*y*(v[x].r-v[x].l+1);
v[x].mx=y;
}
void clear(int x)
{
if (v[x].l==v[x].r)
return;
if (tag[x])
{
S(x<<1,tag[x]),S(x<<1|1,tag[x]);
tag[x]=0;
}
}
void update(int x)
{
v[x]=v[x<<1]+v[x<<1|1];
}
void build(int x,int l,int r)
{
if (l==r)
{
v[x].l=l,v[x].r=r;
v[x].sum=l;
v[x].mx=l;
tag[x]=0;
return;
}
int mid=l+r>>1;
build(x<<1,l,mid),build(x<<1|1,mid+1,r);
update(x);
}
int search(int x,int y,int l,int r)
{
clear(x);
if (l==r)
if (v[x].mx>y)
return l;
else
return 0;
int mid=l+r>>1;
if (v[x<<1].mx>y)
return search(x<<1,y,l,mid);
else
return search(x<<1|1,y,mid+1,r);
}
void set(int x,int st,int en,int l,int r,int edit)
{
clear(x);
if (st==l&&en==r)
{
S(x,edit);
return;
}
int mid=l+r>>1;
if (en<=mid)
set(x<<1,st,en,l,mid,edit);
else
if (mid+1<=st)
set(x<<1|1,st,en,mid+1,r,edit);
else
set(x<<1,st,mid,l,mid,edit),set(x<<1|1,mid+1,en,mid+1,r,edit);
update(x);
}
}t;
LL last;
int n,m;
int main()
{
freopen("friend.in","r",stdin);
freopen("friend.out","w",stdout);
n=read(),m=read();
t.build(1,1,n);
last=t.v[1].sum;
for (int i=1;i<=m;i++)
{
int l=read(),r=read();
int p=t.search(1,l,1,n);
if (l<=p&&p<=r)
t.set(1,p,r,1,n,l);
LL ans=last-t.v[1].sum;
printf("%lld\n",ans);
last=t.v[1].sum;
}
fclose(stdin);
fclose(stdout);
return 0;
}
//sequence
#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
const int N=1005;
const int L=14;
const int C=N*L/2;
const int S=3500;
const int P=67;
const int A=1<<L;
int pre[N][N],suf[N][N],tot[N];
int per[N],rem[N],pos[N],p[N];
bool exist[N],used[N];
int f[S][C];
int id[A];
int n,K,cnt,l,cur;
LL ans;
int lowbit(int x){return x&-x;}
int bitcount(int s)
{
int ret=0;
for (;s;s-=lowbit(s)) ++ret;
return ret;
}
void prepare()
{
for (int i=1;i<=n;++i)
{
for (int j=1;j<=n;++j) pre[i][j]=pre[i-1][j];
if (per[i]) ++pre[i][per[i]];
}
for (int i=1;i<=n;++i)
for (int j=n;j>=1;--j)
pre[i][j]+=pre[i][j+1];
for (int i=n;i>=1;--i)
{
for (int j=1;j<=n;++j) suf[i][j]=suf[i+1][j];
if (per[i]) ++suf[i][per[i]];
}
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
suf[i][j]+=suf[i][j-1];
for (int i=1;i<=n;++i)
if (per[i]) cur+=pre[i][per[i]+1];
l=pos[0]/2;
for (int s=0;s<1<<pos[0];++s)
if (bitcount(s)==pos[0]-l)
id[s]=++cnt;
}
int tmp[20],rec[20];
void load(int curr)
{
int s=0;
for (int i=l+1;i<=pos[0];++i) s|=1<<p[i]-1;
int sid=id[s],ret=curr;
for (int i=l+1;i<=pos[0];++i) ret+=pre[pos[i]][rem[p[i]]+1]+suf[pos[i]][rem[p[i]]-1];
tmp[0]=0,rec[0]=0;
for (int i=1;i<=pos[0];++i)
if (!((s>>i-1)&1)) tmp[++tmp[0]]=rem[i];
else rec[++rec[0]]=rem[i];
sort(tmp+1,tmp+1+tmp[0]),sort(rec+1,rec+1+rec[0]);
for (int i=1,ptr=1;i<=rec[0];++i)
{
for (;ptr<=tmp[0]&&tmp[ptr]<rec[i];++ptr);
ret+=tmp[0]+1-ptr;
}
++f[sid][ret];
}
void dfs(int x,int curr)
{
if (x==pos[0]+1)
{
load(curr);
return;
}
int total=0;
for (int i=1;i<=rem[0];++i)
if (!used[i]) used[i]=1,p[x]=i,dfs(x+1,curr+x-l-1-total),used[i]=0;
else ++total;
}
void solve(int curr)
{
int s=0;
for (int i=1;i<=l;++i) s|=1<<p[i]-1;
int sid=id[((1<<pos[0])-1)^s],ret=curr;
for (int i=1;i<=l;++i) ret+=pre[pos[i]][rem[p[i]]+1]+suf[pos[i]][rem[p[i]]-1];
if (K-cur-ret>=0&&K-cur-ret<=n*(pos[0]-l)) ans+=f[sid][K-cur-ret];
}
void calc(int x,int curr)
{
if (x==l+1)
{
solve(curr);
return;
}
int total=0;
for (int i=1;i<=rem[0];++i)
if (!used[i]) used[i]=1,p[x]=i,calc(x+1,curr+x-1-total),used[i]=0;
else ++total;
}
int main()
{
freopen("sequence.in","r",stdin),freopen("sequence.out","w",stdout);
scanf("%d%d",&n,&K);
for (int i=1;i<=n;++i)
{
scanf("%d",&per[i]);
if (!per[i]) pos[++pos[0]]=i;
else exist[per[i]]=1;
}
for (int i=1;i<=n;++i) if (!exist[i]) rem[++rem[0]]=i;
prepare(),dfs(l+1,0),calc(1,0);
printf("%lld\n",ans);
fclose(stdin),fclose(stdout);
return 0;
}