Day1:二分答案,三分查找,快速幂,欧拉筛素数 | 题目:火星人,Bridge,GCD,Prime Path

  • 二分答案

【JSOI 2008】 火星人

对于第一个操作用\(hash + 二分\)来求得,二三直接平衡树维护即可。

【Bridge】

混合图欧拉回路模板,还是挺有意思OTZ...

具体就是首先调整图的定向,使得有欧拉回路(入度=出度)。

然后,将所有\(in>out\)的点向超级汇点连一个容量为\((in - out)>>1\)的边,超级源点向所有\((out > in)\)的点连一条容量是\((out - in)>>1\)的边,对于图中所有定向为\((x,y)\)的无向边连一个容量为1的边。

接着跑网络流,看是否满流判断有解还是无解。

最后把在网络流中建出的容量为1的边中经过流量的边反向,就跑出了一个欧拉回路有向图。

#include<bits/stdc++.h>
using namespace std;
#define debug(x) cout<<"#X:"<<x<<endl;
const int maxn = 200010;
const int INF = 0x3f3f3f3f;
inline int read(){
int q=0,f=1;char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;ch=getchar();
}
while(isdigit(ch)){
q=q*10+ch-'0';ch=getchar();
}
return q*f;
} struct edge{
int to;
int nxt;
int w;
}e[maxn];
int cnt = 1;
int head[maxn]; inline void add(int u,int v,int w) {
e[++cnt].to = v;
e[cnt].nxt = head[u];
head[u] = cnt;
e[cnt].w = w;
} inline void Add(int u,int v,int w) {
add(u,v,w);
add(v,u,0);
}
int S,T;
int dis[maxn];
queue<int>q;
int cur[maxn];
inline bool bfs() {
for(int i = S;i <= T; ++i) {
dis[i] = -1;
}
dis[S] = 0;
q.push(S);
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = head[u];i;i=e[i].nxt) {
int y = e[i].to;
if(e[i].w && dis[y] == -1) {
dis[y] = dis[u] + 1;
q.push(y);
}
}
}
return dis[T] != -1;
} inline int dfs(int x,int f) {
if(x == T) return f;
int w;
int used = 0;
for(int i = cur[x];i;i=e[i].nxt) {
int y = e[i].to;
if(e[i].w && dis[y] == dis[x] + 1){
w = dfs(y,min(e[i].w,f - used));
e[i].w -= w;
e[i ^ 1].w += w;
used += w;
if(e[i].w)cur[x] = i;
if(used == f) return f;
}
}
if(!used) dis[x] = -1;
return used;
} inline int dinic(){
int ans = 0;
while(bfs()) {
for(int i = S;i <= T; ++i) {
cur[i] = head[i];
}
ans += dfs(S,INF);
}
return ans;
}
int in[maxn];
int out[maxn];
int n,m;
int u[maxn];
int v[maxn];
int w1[maxn];
int sum;
int w2[maxn];
inline bool check(int mid) {
memset(head,0,sizeof(head));
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
cnt = 1;
S = 0,T = n + 1;
sum = 0;
for(int i = 1;i <= m; ++i) {
if(w1[i] <= mid) out[u[i]]++,in[v[i]]++;
if(w2[i] <= mid) Add(v[i],u[i],1);
}
for(int i = 1;i <= n; ++i) {
if(abs(in[i] - out[i]) & 1) return 0;
}
for(int i = 1;i <= n; ++i) {
int c = in[i] - out[i];
if(c > 0) {
sum += (c >> 1);
}
if(c > 0){
Add(S,i,c>>1);
}
if(c < 0){
Add(i,T,(-c)>>1);
}
}
int res = dinic();
return res == sum;
}
int l,r;
int main() {
n = read(),m = read();
l = INF;
r = -INF;
for(int i = 1;i <= m; ++i) {
u[i] = read(),v[i] = read(),w1[i] = read(),w2[i] = read();
if(w1[i] > w2[i]) swap(w1[i],w2[i]),swap(u[i],v[i]);
l = min(l,w1[i]);
r = max(r,w2[i]);
}
//debug(1);
while(l <= r) {
int mid = (l + r) >> 1;
//debug(mid);
if(check(mid)){
r = mid - 1;
}
else {
l = mid + 1;
}
}
if(!check(l)){
puts("NIE");
}
else printf("%d\n",l);
return 0;
}
  • 三分查找

似乎好像会啊...OTZ

期末考试算不算??

其实比二分有点就是函数可以不单调。

每次把区间三分(l,l+(r-l)/3,r-(r-l)/3,r)比较哪个更靠近最值,然后取舍区间即可。


  • 快速幂

啊啊还是总结一下模板算了...

inline int pow(int x,int y) {
int res = 1;
while(y) {
if(y & 1) res = res * x;
x = x * x;
y >>= 1;
}
return res;
}
  • 欧拉筛素数

一个欧拉筛啊。。。

inline void init(){
int tot = 0;
memset(check, 0, sizeof(check));
for (int i = 2; i < MAXL; ++i)
{
if (!check[i])
{
prime[tot++] = i;
}
for (int j = 0; j < tot; ++j)
{
if (i * prime[j] > MAXL)
{
break;
}
check[i*prime[j]] = 1;
if (i % prime[j] == 0)
{
break;
}
}
}
}

欧拉函数

inline void init(){
int tot = 0;
phi[1] = 1;
memset(check, 0, sizeof(check));
for (int i = 2; i < MAXL; ++i)
{
if (!check[i])
{
prime[tot++] = i;
phi[i] = i - 1;
}
for (int j = 0; j < tot; ++j)
{
if (i * prime[j] > MAXL)
{
break;
}
check[i*prime[j]] = 1;
if (i % prime[j] == 0)
{
phi[i*prime[j]] = phi[i] * prime[j];
break;
}else
{
phi[i*prime[j]] = phi[i] * (prime[j]-1);
}
}
}
}

【bzoj 2095】GCD

对于每个素数,影响的只有\([1,n/p]\)筛出欧拉素数之后前缀和处理。

#include <bits/stdc++.h>
const int maxn = 10000010;
using namespace std;
int phi[maxn];
int prime[maxn];
bool vis[maxn];
long long ans;
int n;
int cnt;
inline void init() {
phi[1] = 1;
for(int i = 2;i <= n; ++i) {
if(!vis[i]) {
phi[i] = i - 1;
prime[++cnt] = i;
}
for(int j = 1;j <= cnt; ++j) {
int tmp = prime[j];
if(i * tmp > n) break;
vis[i * tmp] = 1;
if(i % tmp == 0) {
phi[i * tmp] = phi[i] * tmp;
}
else {
phi[i * tmp] = phi[i] * phi[tmp];
}
}
}
}
long long s[maxn];
int main (){
cin >> n;
init();
for(int i = 1;i <= n; ++i) {
s[i] = s[i - 1] + phi[i];
}
for(int i = 1;i <= cnt; ++i) {
ans += (s[n / prime[i]]<<1) - 1;
}
cout<<ans<<endl;
return 0;
}

【poj 3126】Prime Path

bfs+素数判定OTZ懒得写了...

Day1结束分割线


训练计划Day1的更多相关文章

  1. NOIp2016 Day1&Day2 解题报告

    Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...

  2. day1

    day1.py ][][: ][: ): : ]['lock'] = 0 json.dump(userlist_message, open(userlist, 'w')) break #输错次数到3次 ...

  3. day1作业--登录入口

    作业概述: 编写一个登录入口,实现如下功能: (1)输入用户名和密码 (2)认证成功后显示欢迎信息 (3)输错三次后锁定 流程图: readme: 1.程序配置文件: 黑名单文件blacklist.t ...

  4. luogu1003铺地毯[noip2011 提高组 Day1 T1]

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

  5. ACM训练计划建议(写给本校acmer,欢迎围观和指正)

    ACM训练计划建议 From:freecode#  Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...

  6. Python学习路程day1

    变量起名: 变量名如果太长,推荐使用下划线来分开,让人看得清晰明白.例:nums_of_alex_girl=19 .或者是驼峰写法,即首字母大写.例:NumOfAlexGf=18 注意:不合法的变量起 ...

  7. 团队项目——站立会议 DAY1

    团队项目--站立会议 DAY1        团队成员介绍(5人):张靖颜.何玥.钟灵毓秀.赵莹.王梓萱        今日(2016/5/6)为站立会议的第一天,一起对团队项目进行讨论,并对每个人的 ...

  8. Day1 login

    使用流程: 1.程序启动后,显示欢迎信息,提示用户输入用户名: 2.判断用户是否存在,不存在则提示重新输入,或者关闭程序:客户存在则提示客户输入密码: 3.判断密码是否正确,如果不正确则提示用户重新输 ...

  9. 2015寒假ACM训练计划

    1月26号至3月4号 每天给自己一个计划.做有意义的事情,不要浪费时间. 8:00——11:30 acm训练 11:30——13:00 午休 13:00——17:30  acm训练 17:30——18 ...

随机推荐

  1. UNLISTEN - 停止监听通知信息

    SYNOPSIS UNLISTEN { name | * } DESCRIPTION 描述 UNLISTEN 用于删除一个现有的已注册的 NOTIFY 事件. UNLISTEN 取消当前 Postgr ...

  2. Berry 异常处理 1: 语法和字节码设计

    语法 最近在实现 Berry 的异常处理特性,进过初步的调查后决定使用类似 Python 的 try-except 异常处理模式,为此要引入三个新的关键字: try:表示异常捕获块的开始,位于异常捕获 ...

  3. Download Kali Linux

    https://www.kali.org/downloads/

  4. c++中创建二维数组的几种方法

    一.用new申请内存空间 int **dp=new int*[n];//动态申请二维数组nxm ;i<n;++i){ dp[i]=new int[m]; } 二.用malloc申请内存空间 ; ...

  5. Oracle实现行转列+Mybatis

    1.需求 报表需要动态展示某几个公司分别在几个月内销售额情况(前端表头月份是动态的,月时间段是前端参数来选择的,最大为12个月), 页面展示如下 Oracle数据库中数据如下: 可以看到一个公司的月份 ...

  6. NX二次开发-UFUN编辑添加哪些图层UF_LAYER_edit_category_layer

    1 NX11+VS2013 2 3 #include <uf.h> 4 #include <uf_layer.h> 5 6 7 UF_initialize(); 8 9 //创 ...

  7. Unity3D中的线程与协程

    线程 Unity3D是以生命周期主线程循环进行游戏开发. Unity3D中的子线程无法运行Unity SDK(开发者工具包,软件包.软件框架)跟API(应用程序编程接口,函数库). 限制原因:大多数游 ...

  8. 20140312 Excel表格画折现图次坐标轴

    1.struct 是8字节对齐 2.char * a, sizeof(a)=4; char a[]="abcdefg";sizeof(a)=8; 3.内存对其齐

  9. Vue项目中同级组件传值的例子

    大家好,今天给大家带来Vue项目中同级组件之间传值的例子,父子组件之间的通信比较简单,这里不做讨论. 假设该项目中的需求如下: 图中左上角有一个按钮,我们的需求是点击它时,侧边导航栏收缩且主界面放大, ...

  10. 7.springboot+mybatis+redis整合

    选择生成的依赖 选择保存的工程路径 查询已经生成的依赖,并修改mysql的版本 <dependencies> <dependency> <groupId>org.s ...