储能表

/*
引自zyz大佬的数学思想
*/
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll; #ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif ll k;int T,p;
int calc(ll x,ll i,ll j){
if(i<j) swap(i,j);
x/=i;
x*=i;
j%=p;
ll l=max(0LL,x-k);
ll r=max(0LL,x+i-k);
ll ans=(l+r-);
if(!(ans&)){
ans=(ans>>)%p;
ans=(ans*((r-l)%p))%p;
}
else{
ans=ans%p;
ans=(ans*((r-l>>)%p))%p;
}
return ans*j%p;
}
int solve(ll n,ll m){
ll ans=;
for(ll i=1LL<<,x=;i;i>>=){
if(n&i){
for(ll j=1LL<<,y=;j;j>>=){
if(m&j){
ans+=calc(x^y,i,j);
ans%=p;
y+=j;
}
}
x+=i;
}
}
return ans;
}
int main(){
for(scanf("%d",&T);T--;){
ll n,m;
scanf(LL LL LL LL,&n,&m,&k,&p);
printf("%d\n",solve(n,m));
}
return ;
}

数字配对

/*
二分图-->费用流
*/
#include<cstdio>
#include<cstdlib>
#include<iostream>
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
using namespace std;
typedef long long i64;
const int N=;
const int M=5e5+;
const i64 inf=10000000000000LL;
struct edge{int v,next;i64 cap,cost;}e[M];int tot=,head[N];
int n,m,S,T,q[N],prev[N];bool vis[N];
i64 a[N],b[N],c[N];
i64 answ,ansf,dis[N];
void add(int x,int y,i64 z,i64 cost){
e[++tot].v=y;e[tot].cap=z;e[tot].cost=cost;e[tot].next=head[x];head[x]=tot;
e[++tot].v=x;e[tot].cap=;e[tot].cost=-cost;e[tot].next=head[y];head[y]=tot;
}
bool spfa(){
for(int i=S;i<=T;i++) vis[i]=,dis[i]=-inf;
unsigned short h=,t=;q[t]=S;dis[S]=;
while(h!=t){
int x=q[++h];vis[x]=;
for(int i=head[x];i;i=e[i].next){
if(e[i].cap&&dis[e[i].v]<dis[x]+e[i].cost){
dis[e[i].v]=dis[x]+e[i].cost;
prev[e[i].v]=i;
if(!vis[e[i].v]){
vis[e[i].v]=;
//if(dis[e[i].v]>dis[x]){
// q[h--]=e[i].v;
//}
//else{
q[++t]=e[i].v;
//}
}
}
}
}
return answ+dis[T]>=;
}
void augment(){
i64 flow=inf;
if(dis[T]<) flow=answ/(-dis[T]);
for(int i=T;i!=S;i=e[prev[i]^].v){
flow=min(flow,e[prev[i]].cap);
}
for(int i=T;i!=S;i=e[prev[i]^].v){
e[prev[i]].cap-=flow;
e[prev[i]^].cap+=flow;
}
ansf+=flow;
answ+=flow*dis[T];
}
i64 fpow(i64 a,i64 p,i64 mod){
i64 res=;
for(;p;p>>=,a=a*a%mod) if(p&) res=res*a%mod;
return res;
}
bool judge(i64 x){
if(x<) return ;
if(x==) return ;
if(x&^) return ;
i64 a,t;
for(int i=;i<=;i++){
a=rand()%M;
if(a>=x&&a%x==) continue;
t=fpow(a,x-,x);
if(t!=) return ;
}
return ;
}
int main(){
scanf("%d",&n);S=,T=n<<|;
for(int i=;i<=n;i++) scanf(LL,&a[i]);
for(int i=;i<=n;i++){
scanf(LL,&b[i]);
add(S,i,b[i],);
add(i+n,T,b[i],);
}
for(int i=;i<=n;i++) scanf(LL,&c[i]);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(i==j) continue;
if(a[j]&&!(a[i]%a[j])&&judge(a[i]/a[j])){
add(i,j+n,inf,c[i]*c[j]);
}
if(a[i]&&!(a[j]%a[i])&&judge(a[j]/a[i])){
add(i,j+n,inf,c[i]*c[j]);
}
}
}
while(spfa()) augment();
printf(LL,ansf/);
return ;
}

游戏

/*
树链剖分+树上差分
*/
#include<cstdio>
#include<algorithm>
using namespace std; #define lc k<<1
#define rc k<<1|1
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif typedef long long ll;
const ll inf=123456789123456789LL;
const int N=1e5+;
struct line{ll a,b;};
struct edge{int v,w,next;}e[N<<];int tot,head[N];
struct sgt{
ll mn;
line a;
bool tag;
sgt(){mn=inf;tag=;}
}tr[N<<];
int n,m,fa[N],son[N],siz[N],pos[N],top[N],dep[N],q[N];
ll ans,dfn[N],dis[N];
void add(int x,int y,int z){
e[++tot].v=y;e[tot].w=z;e[tot].next=head[x];head[x]=tot;
e[++tot].v=x;e[tot].w=z;e[tot].next=head[y];head[y]=tot;
}
void bfs(){
int h=,t=;q[t]=;dep[]=;fa[]=;
while(h!=t){
int x=q[++h];
for(int i=head[x];i;i=e[i].next){
int v=e[i].v;
if(v!=fa[x]){
fa[v]=x;
dep[v]=dep[x]+;
dis[v]=dis[x]+e[i].w;
q[++t]=v;
}
}
}
for(int j=n;j;j--){
int x=q[j];siz[x]=;son[x]=;
for(int i=head[x];i;i=e[i].next){
int v=e[i].v;
if(fa[v]==x){
siz[x]+=siz[v];
if(siz[son[x]]<siz[v]) son[x]=v;
}
}
}
int bfs_cnt=;
for(int j=;j<=n;j++){
int x=q[j];
if(!pos[x]){
for(int y=x;y;y=son[y]){
pos[y]=++bfs_cnt;
dfn[bfs_cnt]=dis[y];
top[y]=x;
}
}
}
}
int lca(int x,int y){
for(;top[x]!=top[y];x=fa[top[x]]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
}
return dep[x]<dep[y]?x:y;
}
ll get(line a,ll x){
return a.a*x+a.b;
}
void change(int k,int l,int r,int opl,int opr,line a){
int mid=l+r>>;
if(opl<=l&&r<=opr){
tr[k].mn=min(tr[k].mn,min(get(a,dfn[l]),get(a,dfn[r])));
if(!tr[k].tag){
tr[k].tag=;tr[k].a=a;
return ;
}
if(l==r){
if(get(a,dfn[l])<get(tr[k].a,dfn[l]))tr[k].a=a;
return ;
}
bool b0=get(a,dfn[l])<get(tr[k].a,dfn[l]);
bool b1=get(a,dfn[mid])<get(tr[k].a,dfn[mid]);
bool b2=get(a,dfn[r])<get(tr[k].a,dfn[r]);
if(!b0&&!b2) return ;
if(b0&&b2){
tr[k].a=a;
return ;
}
if(b1){
swap(a,tr[k].a);
b0^=;b2^=;
}
if(b0) change(lc,l,mid,opl,opr,a);
if(b2) change(rc,mid+,r,opl,opr,a);
return ;
}
if(opl<=mid) change(lc,l,mid,opl,opr,a);
if(mid+<=opr) change(rc,mid+,r,opl,opr,a);
tr[k].mn=min(tr[k].mn,min(tr[lc].mn,tr[rc].mn));
}
void query(int k,int l,int r,int opl,int opr){
if(opl<=l&&r<=opr){
ans=min(ans,tr[k].mn);
return ;
}
if(tr[k].tag){
ans=min(ans,min(get(tr[k].a,dfn[max(l,opl)]),get(tr[k].a,dfn[min(r,opr)])));
}
int mid=l+r>>;
if(opl<=mid) query(lc,l,mid,opl,opr);
if(mid+<=opr) query(rc,mid+,r,opl,opr);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=,x,y,z;i<n;i++){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
bfs();
for(int i=,opt,x,y,z;i<=m;i++){
scanf("%d",&opt);
if(opt&){
ll a,b;
scanf("%d%d",&x,&y);
scanf(LL LL ,&a,&b);
z=lca(x,y);
ll Ax=-a,Bx=a*dis[x]+b;
ll Ay=a,By=a*(-*dis[z]+dis[x])+b;
for(;dep[top[x]]>dep[z];x=fa[top[x]]){
change(,,n,pos[top[x]],pos[x],(line){Ax,Bx});
}
for(;dep[top[y]]>dep[z];y=fa[top[y]]){
change(,,n,pos[top[y]],pos[y],(line){Ay,By});
}
if(x!=z) change(,,n,pos[z],pos[x],(line){Ax,Bx});
else if(y!=z) change(,,n,pos[z],pos[y],(line){Ay,By});
else change(,,n,pos[z],pos[z],(line){Ax,Bx});
}
else{
scanf("%d%d",&x,&y);
ans=inf;
z=lca(x,y);
for(;dep[top[x]]>dep[z];x=fa[top[x]]){
query(,,n,pos[top[x]],pos[x]);
}
for(;dep[top[y]]>dep[z];y=fa[top[y]]){
query(,,n,pos[top[y]],pos[y]);
}
if(x!=z) query(,,n,pos[z],pos[x]);
else if(y!=z) query(,,n,pos[z],pos[y]);
else query(,,n,pos[z],pos[z]);
printf(LL "\n",ans);
}
}
return ;
}

SDOI 2016 Round1 Day1的更多相关文章

  1. 【BZOJ 4515】【SDOI 2016 Round1 Day1 T3】游戏

    考场上写了lct,可惜当时对标记永久化的理解并不是十分深刻,导致调一个错误的程序调了4h+,最后这道题爆0了QwQ 现在写了树链剖分,用标记永久化的线段树维护轻重链,对于$s\rightarrow l ...

  2. 【BZOJ 4517】【SDOI 2016 Round1 Day2 T2】排列计数

    本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看 ...

  3. 【BZOJ 4598】【SDOI 2016 Round2 Day1 T3】模式字符串

    2016-05-21因为BZOJ上“ 数据文件太过巨大,仅提供前三组数据测试.”所以我考场上写的60分的点分治交上去也A了. 我的这个点分治的时间复杂度是$O(Tnmlogn)$的,听题解时没听懂$O ...

  4. 【NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2】游记

    我第一次写游记,,,, 正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪 ...

  5. 【BZOJ 4518】【SDOI 2016 Round1 Day2 T3】征途

    比较明显的斜率优化DP,省选时因为时间太紧张和斜率DP写得不熟等原因只写了60分的暴力DP,其实当时完全可以对拍来检验标算的正确,但是我当时too naive- 很快打完了,调了将近一晚上QAQ,因为 ...

  6. SDOI 2016 Round1 Day2

    生成魔咒 /* 后缀数组+双向链表 参照:https://blog.csdn.net/clove_unique/article/details/53911757 */ #include<cstd ...

  7. SDOI 2019 Round1 游记

    \(SDOI~2019 ~ Round1\) 游记 \(Day ~0\) 报道.骑车子去的,好热.到了之后看到好几个同校神仙,还从那里莫名其妙的等了一会,然后交了钱签了名就拿挂牌走人了.现在居然还有受 ...

  8. SDOI 2016 游戏

    树链剖分 线段树维护区间最小值,区间最大值 更新,对于每一个区间,找到当前区间的最小值的最大值,和要更新的值比较,如果比最大值还大,则此数对于以后的询问无任何贡献,直接返回即可,若有贡献,则一直递归到 ...

  9. SDOI 2016 数字配对

    题目大意:给定n个数字以及每个数字的个数和权值,将满足条件的数字配对,使得总代价不小于0,且配对最多 最大费用最大流拆点,对于每个点,连一条由S到该点的边,容量为b,花费为0,再连一条到T的边 对于每 ...

随机推荐

  1. Java防止SQL注入的几个途径

    java防SQL注入,最简单的办法是杜绝SQL拼接,SQL注入攻击能得逞是因为在原有SQL语句中加入了新的逻辑,如果使用 PreparedStatement来代替Statement来执行SQL语句,其 ...

  2. 通过项目了解JAVA注解

    java自定义注解实践 ² 背景 最近在为公司的技术改造做准备,我设计了一个提高Web开发效率的技术框架,为了增加框架的友好性和易用性,决定采用注解来代替配置文件,于是我查询了很多的资料,进行整理和学 ...

  3. Linux非阻塞IO(三)非阻塞IO中缓冲区Buffer的实现

    本文我们来实现回射服务器的Buffer.   Buffer的实现   上节提到了非阻塞IO必须具备Buffer.再次将Buffer的设计描述一下: 这里必须补充一点,writeIndex指向空闲空间的 ...

  4. django model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct

    1.多表连接查询:当我知道这点的时候顿时觉得django太NX了.  class A(models.Model):    name = models.CharField(u'名称')  class B ...

  5. angularjs与server交互

    真正的应用须要和真实的server进行交互,移动应用和新兴的Chrome桌面应用可能是个例外,可是对于此外的全部应用来说,不管你是想把数据持久化到云端.还是须要与其它用户进行实时交互.都须要让应用与s ...

  6. windows远程桌面如果超出最大连接数, 使用命令行mstsc /console登录即可

    远程桌面如果超出最大连接数, 使用命令行mstsc /console登录即可. (也可以用 mstsc /admin) 可以在运行里使用mstsc /console /v:IP:远程端口即可强制登录; ...

  7. sql server 执行大.sql文件

    打开cmd执行:osql -S 127.0.0.1 -U sa -P sa -i d:\test.sql 执行后会提示输入密码.

  8. PHP面试题及答案解析(4)—PHP核心技术

    1.写出一个能创建多级目录的PHP函数. <?php /** * 创建多级目录 * @param $path string 要创建的目录 * @param $mode int 创建目录的模式,在 ...

  9. Android使用Fragment打造万能页面切换框架

    首先我们来回顾一下传统用Activity进行的页面切换.activity之间切换.首先须要新建intent对象,给该对象设置一些必须的參数,然后调用startActivity方法进行页面跳转. 假设须 ...

  10. mysql忘记root密码解决

    修改配置文件:my.cnf  加上skip-grant-tables 重启mysql mysql -uroot  登录 mysql> USE mysql ; mysql> UPDATE u ...