SDOI 2016 Round1 Day1
储能表
/*
引自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的更多相关文章
- 【BZOJ 4515】【SDOI 2016 Round1 Day1 T3】游戏
考场上写了lct,可惜当时对标记永久化的理解并不是十分深刻,导致调一个错误的程序调了4h+,最后这道题爆0了QwQ 现在写了树链剖分,用标记永久化的线段树维护轻重链,对于$s\rightarrow l ...
- 【BZOJ 4517】【SDOI 2016 Round1 Day2 T2】排列计数
本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看 ...
- 【BZOJ 4598】【SDOI 2016 Round2 Day1 T3】模式字符串
2016-05-21因为BZOJ上“ 数据文件太过巨大,仅提供前三组数据测试.”所以我考场上写的60分的点分治交上去也A了. 我的这个点分治的时间复杂度是$O(Tnmlogn)$的,听题解时没听懂$O ...
- 【NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2】游记
我第一次写游记,,,, 正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪 ...
- 【BZOJ 4518】【SDOI 2016 Round1 Day2 T3】征途
比较明显的斜率优化DP,省选时因为时间太紧张和斜率DP写得不熟等原因只写了60分的暴力DP,其实当时完全可以对拍来检验标算的正确,但是我当时too naive- 很快打完了,调了将近一晚上QAQ,因为 ...
- SDOI 2016 Round1 Day2
生成魔咒 /* 后缀数组+双向链表 参照:https://blog.csdn.net/clove_unique/article/details/53911757 */ #include<cstd ...
- SDOI 2019 Round1 游记
\(SDOI~2019 ~ Round1\) 游记 \(Day ~0\) 报道.骑车子去的,好热.到了之后看到好几个同校神仙,还从那里莫名其妙的等了一会,然后交了钱签了名就拿挂牌走人了.现在居然还有受 ...
- SDOI 2016 游戏
树链剖分 线段树维护区间最小值,区间最大值 更新,对于每一个区间,找到当前区间的最小值的最大值,和要更新的值比较,如果比最大值还大,则此数对于以后的询问无任何贡献,直接返回即可,若有贡献,则一直递归到 ...
- SDOI 2016 数字配对
题目大意:给定n个数字以及每个数字的个数和权值,将满足条件的数字配对,使得总代价不小于0,且配对最多 最大费用最大流拆点,对于每个点,连一条由S到该点的边,容量为b,花费为0,再连一条到T的边 对于每 ...
随机推荐
- maven自己主动编译,解决你每次代码改动须要又一次编译的繁琐
maven结构的项目,我们在每次改动代码后都会须要手动编译,以下命令能够解决此问题.仅仅要代码改动.会自己主动帮你编译. 进入项目文件夹运行:mvn -U eclipse:clean eclipse: ...
- 11款最棒的Linux数据恢复工具
无论你使用的是台式电脑还是笔记本,需要关注的重点之一都是如何保护好你的宝贵数据.因为总会有各种突发情况使你的系统崩溃,然后你要做的就是恢复数据.不管你怎么想,要是我失去了所有的数据却无法恢复的话,我会 ...
- Python-爬虫-针对有frame框架的页面
有的页面会使用frame 框架,使用Selenium + PhantomJS 后并不会加载iframe 框架中的网页内容.iframe 框架相当于在页面中又加载了一个页面,需要使用Selenium 的 ...
- ECSHOP删除云服务
一.删除[云服务中心]删除/admin/cloud.php删除/admin/templates/menu.htm中以下代码 Ajax.call('cloud.php?is_ajax=1>act= ...
- 2017.8.23 postgresql的外键
1.增加/删除外键的语法 ALTER TABLE t_permission ADD CONSTRAINT fkey FOREIGN KEY (fd_resid) REFERENCES t_resour ...
- 2017.5.24 在intelliJ IDEA 中生成war包
1.勾选Build on make file -> project structure -> Artifacts 2.compile module "***" 选择项目 ...
- 2016.6.30 tomcat开启时,显示端口被占用,如何修改端口
开启tomcat时,有时候会显示端口8080已占用,所以需要将端口改为其他值. 找到tomcat的server.xml文件,修改为8088,如图所示:
- Java三大器之拦截器(Interceptor)的实现原理及代码示例
1,拦截器的概念 java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了 ...
- iOS_新版iOS11 UITbleView适配的一些问题及解决方法
// tableView 偏移20/64适配 if (@available(iOS 11.0, *)) { self.tableView.contentInsetAdjustmentBehavior ...
- 使用RTTI为继承体系编写”==”运算符
转载请注明出处:http://www.cnblogs.com/inevermore/p/4012079.html RTTI,指的是运行时类型识别技术. 先看一个貌似无关的问题: 为继承体系 ...