博客园的编辑器真的是太蛋疼了= =,想用tex然后上jpg又贴不了链接,真的很纠结啊= =

T1:[TJOI2015]线性代数

描述:戳上面吧= =

首先这道题我觉得是这套题最漂亮的一道题了(虽然说学校的题库里居然有一道和这个一模一样的= =)

首先我们可以先把那个式子转化为其中b[i]是表示矩阵a中第i行为0或为1,然后就有两种方法转化为网络流啦

方法一:可以用最大权闭合子图的方法来考虑,将c[i]以及a[i][j]的选择与否视为事件的话,可以发现是一个点数为n*n的最大权闭合子图,就可以愉快的用网络流来搞辣

方法二:我们可以看做一个二元关系,因为可以看做i的选取会花费 c[i],而同时选择i, j则会获得一定的收益,那么我们可以得到一个二元关系(但还是需要经过一定的转化的),然后点数就只有n啦

我只写了方法一,虽说点数很多,但边数少,还是很快的

还有一种水法,貌似直接把所有a相加然后减去b就行辣(数据就是这么水= =)

CODE:

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 300000
#define maxm 900000
struct edges{
int to,next,cap;
}edge[maxm*];
int next[maxn],l;
inline void addedge(int x,int y,int z) {
l++;
edge[l*]=(edges){y,next[x],z};next[x]=l*;
edge[l*+]=(edges){x,next[y],};next[y]=l*+;
}
#define inf 0x7fffffff
int s,t,h[maxn],p[maxn],gap[maxn];
int sap(int u,int flow) {
if (u==t) return flow;
int cnt=;
for (int i=p[u];i;i=edge[i].next)
if (edge[i].cap&&h[u]==h[edge[i].to]+) {
int cur=sap(edge[i].to,min(flow-cnt,edge[i].cap));
edge[i].cap-=cur;edge[i^].cap+=cur;
p[u]=i;
if ((cnt+=cur)==flow) return cnt;
}
if (!(--gap[h[u]])) h[s]=t;
gap[++h[u]]++;
p[u]=next[u];
return cnt;
}
inline int maxflow(){
for (int i=;i<=t;i++) p[i]=next[i];
memset(gap,,sizeof(gap));
memset(h,,sizeof(h));
gap[]=t;
int flow=;
while (h[s]<t) flow+=sap(s,inf);
return flow;
}
int id[][],cnt,n;
int main(){
freopen("algebra.in","r",stdin);
freopen("algebra.out","w",stdout);
scanf("%d",&n);
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) id[i][j]=++cnt;
s=++cnt,t=++cnt;
int sum=;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) {
int x;
scanf("%d",&x);
addedge(s,id[i][j],x);
sum+=x;
}
for (int i=;i<=n;i++) {
int x;
scanf("%d",&x);
addedge(id[][i],t,x);
}
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) {
addedge(id[i][j],id[][i],inf);
addedge(id[i][j],id[][j],inf);
}
printf("%d\n",sum-maxflow());
return ;
}

T2:[TJOI2015]组合数学

这是道结论题= =

某个啥啥定理说:DAG的最小链覆盖=最大独立点集,可见网格图的最大独立点集一定是从右上到左下的一条路径,那么我们就可以直接dp搞了

CODE:

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 1100
int f[maxn][maxn],a[maxn][maxn],T,n,m;
int main(){
freopen("math.in","r",stdin);
freopen("math.out","w",stdout);
scanf("%d",&T);
while (T--) {
memset(f,,sizeof(f));
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++) scanf("%d",a[i]+j);
int ans=;
for (int i=n;i;i--)
for (int j=;j<=m;j++) {
f[i][j]=max(f[i][j-],max(f[i+][j-]+a[i][j],f[i+][j]));
ans=max(ans,f[i][j]);
}
printf("%d\n",ans);
}
return ;
}

T3:[TJOI2015]弦论

这道题嘛= =,50分算法是深圳市选题,然后100分的话我们可以用SAM来解决这个问题

首先我们先来考虑一下50分的算法,SAM上的每一个节点都表示该图中的一个子串,所以我们可以类似dp求出答案

而对于T=1的时候,可以发现重复的字串其实都在以parents树上该节点为根的子树

所以我们还是可以dp一下求出来

八中上被卡常数了,老调不出来

CODE:

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 1001000
char s[maxn];
typedef long long ll;
struct sam{
sam *pre,*ch[];
int val,cnt;ll size;
bool b;
}_t[maxn];
sam *root,*last;
int t,cnt;
inline void add(int x) {
sam *p=last;
_t[++cnt].val=last->val+;
sam *np=_t+cnt;
while (p&&p->ch[x]==) p->ch[x]=np,p=p->pre;
if (p==) np->pre=root;
else {
sam* q=p->ch[x];
if (p->val+==q->val) np->pre=q;
else {
_t[++cnt].val=p->val+;
sam*nq=_t+cnt;
memcpy(nq->ch,q->ch,sizeof(q->ch));
nq->pre=q->pre;
np->pre=q->pre=nq;
while (p&&p->ch[x]==q) p->ch[x]=nq,p=p->pre;
}
}
last=np;
}
inline void bfs(){
static sam* q[maxn];
q[]=root;
sam* u=q[];
int l,r;
for (l=r=;l<=r;u=q[++l]) {
for (int i=;i<;i++) {
if (!u->ch[i]||u->ch[i]->b) continue;
u->ch[i]->b=;
q[++r]=u->ch[i];
}
}
u=q[r];
for (int i=r;i;u=q[--i]) {
if (!t) u->cnt=;
if (i==) u->cnt=;
if (u->pre) u->pre->cnt+=u->cnt;
}
}
char ans[maxn];
int l;
void dfs(sam *p){
int i;
p->b=;
p->size=p->cnt;
for(i=;i<;i++)
if(p->ch[i]){
if(p->ch[i]->b==) dfs(p->ch[i]);
p->size+=p->ch[i]->size;
}
}
int k;
void get(sam *p){
int i;
if(k<=p->cnt) return ;
k-=p->cnt;
for(i=;i<;i++)
if(p->ch[i]){
if(k<=p->ch[i]->size){
ans[++l]=i+'a';
get(p->ch[i]);
return ;
}
k-=p->ch[i]->size;
}
}
int main(){
scanf("%s%d%d",&s,&t,&k);
root=_t;
root->val=;last=root;
int n=strlen(s);
for (int i=;i<n;i++) {
add(s[i]-'a');
last->cnt=;
}
bfs();
dfs(root);
if (root->size<k) {
printf("-1\n");
return ;
}
get(root);
printf("%s\n",ans+);
return ;
}

TJOI2015 day1解题报告的更多相关文章

  1. 学大伟业Day1解题报告

    学大伟业Day1解题报告 张炳琪 一.   时间分配 T1:30分钟  T2: 60分钟  T3:100分钟 二.答题情况及错因 T1:100         T2:55             T3 ...

  2. 常州培训 day1 解题报告

    第一题:(骗分容易,AC难.) 题目大意: 给出一个字符串,找出满足条件A的区间的个数.A:字符A,B,C的出现次数相同. 都出现0次也算,区间的长度可以是0(就是只有一个数).30% |S| ≤ 1 ...

  3. TJOI2015 day2解题报告

    TJOI2015终于写完啦~~~ T1:[TJOI2015]旅游 描述:(BZ没题面只能口述了..)一个人在一棵树上走,每次从a->b会进行一次贸易(也就是在这条路径上买入物品然后在后面卖出)然 ...

  4. 洛谷 P3975 [TJOI2015]弦论 解题报告

    P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...

  5. NOIP2018提高组Day1 解题报告

    前言 关于\(NOIP2018\),详见此博客:NOIP2018学军中学游记(11.09~11.11). 这次\(NOIP\ Day1\)的题目听说很简单(毕竟是三道原题),然而我\(T3\)依然悲剧 ...

  6. NOIP 2017 Day1 解题报告

    总分:100分 T1,小凯的疑惑, 100分 T2,时间复杂度,0分 T3,逛公园,0分 T1 ###题意简化: 给定两个互质的数字,输出最大不能表示的数: 基础数论题目 代码: #include&l ...

  7. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)解题报告

    最近参加了很多CH上的比赛呢~Rating--了..题目各种跪烂.各种膜拜大神OTZZZ T1珠 描述 萌蛋有n颗珠子,每一颗珠子都写有一个数字.萌蛋把它们用线串成了环.我们称一个数字串是有趣的,当且 ...

  8. 【洛谷】NOIP2018原创模拟赛DAY1解题报告

    点此进入比赛 T1:小凯的数字 题意:给定q个l,r,求l(l+1)(l+2)...(r-1)r模9的结果 很显然,这是道考验数(运)学(气)的题目 结论:输出\((l+r)*(r-l+1)\over ...

  9. 2017.7.15清北夏令营精英班Day1解题报告

    成绩: 预计分数:20+10+40 实际分数:100+10+40. 一百三十多人的比赛全场rand7还水了个鼠标+键盘 unbelievable! 考试题目链接: https://www.luogu. ...

随机推荐

  1. IOS开发中摇一摇是怎么实现的

    三个方法,分别是开始摇一摇,结束摇一摇,取消摇一摇,我们可以在里面对应的进行事件处理,或者在ui上进行信息展示: 1.开始摇一摇:(在实际app中用需要处理的语句替换NSLog(@"开始摇一 ...

  2. mybatis sql中if判断传入Integer类型,传入0时,判断没有执行

    数据库中字段 isDisable 0:否:1:是 xml中判断 <if test="isDisable != null and isDisable !='' "> AN ...

  3. 好的 vim编辑博客

    http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html 如果你不满足于使用现成的颜色主题的话,那我们来看一下如何修改环境配色.首先要 ...

  4. windows下Nodejs环境部署

    前言 Nodejs是基于v8引擎的轻量级框架,其特点为事件驱动.非阻塞.单线程.异步回调等. Nodejs相对于其他运行在服务器端的语言,容易学习,使用方便. 本文将介绍windows下Nodejs的 ...

  5. SpringMVC常用注解@Controller,@Service,@repository,@Component

    SpringMVC常用注解@Controller,@Service,@repository,@Component controller层使用@controller注解 @Controller 用于标记 ...

  6. Unity中使用多构造函数

    如果要实例化的类只有一个构造函数, 则使用方法很简单使用方法如下: 1 2 3 4 5 6 7 using (IUnityContainer container = new UnityContaine ...

  7. 【腾讯Bugly干货分享】iOS 中 HTTPS 证书验证浅析

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/-fLLTtip509K6pNOTkflPQ 导语 本 ...

  8. Chrome 出现adobe flash is out of date的解决方法

    最近使用安装了ubuntu和linux mint,都发现firefox的flash虽然能用,但还是觉得有点小问题,想使用google chrome,但无奈,一安装使用后就发现flash不能用,显示ad ...

  9. 如何使用HTTPS防止流量劫持

    何为流量劫持 前不久小米等六家互联网公司发表联合声明,呼吁运营商打击流量劫持.流量劫持最直观的表现,就是网页上被插入了一些乱七八糟的广告/弹窗之类的内容.比如这样: 网页右下角被插入了游戏的广告. 流 ...

  10. U盘安装系统

    http://www.ushendu.com/usdpzxt/1566.html http://www.ushendu.com/plus/view.php?aid=1571 http://www.ud ...