周末DHU友谊赛(半日游)感想

DHU的校园挺好的啊,感觉教学楼啊,整体环境啊比咱学校好上一些,和大家一起出来有些春(冬)游的意味,食堂也是十分的宽敞,座位好多!

吐槽shu的食堂座位到饭点明显太少,食堂品类好多,shu的吃多了感觉没啥新奇的了呢。

然后友谊赛正题。昨天被徐州复现虐了,又打了广工的新生赛,打的还行叭,虽然没ak,真的挺想ak一次的(555估计没这机会了),所以今天的友谊赛也有报一些期待。

最后只有4题滚粗。

我还是没自己想象中的强啊。

前期70多分钟,我交题一直没反馈,我以为大家都这样?也看不了榜(怎么可能交题不给反馈,我真的sb)然后就一直做下去,

做到第四题,看到了别人能看榜,我就tm立刻叫志愿者了,才知道我机子的域名不对,.120搞到.119去了,然后才开始交题,还是挺sb的吧我,下次比赛碰到异常情况一定要第一时间举手找帮助。

然后我看到第四题,榜1也才第四题,其实我做前面的题速度还不错的,然后就在77~80分钟将这三道题全交了,都是1A,还挺舒服。当然后来发现第二题没读题面,直接写dfs有点亏~

然后就随便模拟匹配了个D题,没自己测好,WA了3发,应该先自己找特殊情况测的,WA可以省,不要让judge给你罚时啊~

然后E就没了,我等等去补,dfs?拓扑?

然后后面2个小时差不多读了剩下的题,然后一直在 想F,冲F(5发呀)

F就两个矩阵相乘,删去第一个矩阵的一行和第二个矩阵的一列使得答案最小,矩阵分别是n*m,和m*k的,都<=1000,

显然如果暴力矩阵乘法,nmk的复杂度承受不起,但题目里的矩阵考究的是以给非0元素的方式输入的,分别为p,q个,且数量都少于1000,少见必妖!所以以此为突破口;

我们记录第一个矩阵里的非0元素,输入第二个矩阵里的非0元素时,对p个第一矩阵中的元素遍历去生成我们的结果矩阵,复杂度可以降到p*q;细节见我的代码;

然后统计结果矩阵每行,每列的值,最后取  min(总的值-行-列+行列)   简单的容斥?反正就是把减了两遍的加上去即可。

(虽然这一步找最小值我想了好多假算法,比如删完行列的最大值,在统计列行的最大值,取更小,太假了,不具备一般情形。最后想到上面这个容斥,结论就显然正确了)

然后我的最终思路完全正确,但最后由于样例给的n=m=k,没测出来,我傻了,最后对sum[i][j] ,结果矩阵应该是n*k的,我用的都是 n和m ,md应该用n和k,真的sb,导致没冲过这题。我的青春结束了(滑稽)

细节上的处理呀,得自己造数据debug啊。

然后继续加油吧。贴个F代码。

 1 #include <bits/stdc++.h>
 2 #define debug(x) cout << #x << ": " << x << endl
 3 using namespace std;
 4 typedef long long ll;
 5 const int maxn=1e3+7;
 6 const int INF=0x3f3f3f3f;
 7 const int MOD=1e9+7;
 8 
 9 ll sum[maxn][maxn];
10 ll sumr[maxn],sumc[maxn];
11 
12 struct node
13 {
14     ll x,y,v;
15 }pp[maxn];
16 
17 int main()
18 {
19     ios::sync_with_stdio(false);
20     cin.tie(0);
21     ll n,m,k;
22     while(cin>>n>>m>>k)
23     {
24         memset(sum,0,sizeof(sum));
25         ll p,q,x,y,v;
26         cin>>p>>q;
27         for(ll i=0;i<p;++i)
28         {
29             cin>>pp[i].x>>pp[i].y>>pp[i].v;
30         }
31         while(q--)
32         {
33             cin>>x>>y>>v;
34             for(ll i=0;i<p;++i)
35             {
36                 if(pp[i].y==x)
37                 {
38                     sum[pp[i].x][y]+=pp[i].v*v;
39                 }
40             }
41         }
42         ll ans=0;
43         for(ll i=1;i<=n;++i)
44         {
45             sumr[i]=0;
46             for(ll j=1;j<=k;++j)
47             {
48                 sumr[i]+=sum[i][j];
49                 //debug(sum[i][j]);
50                 ans+=sum[i][j];
51             }
52             cout<<endl;
53         }
54         for(ll j=1;j<=k;++j)
55         {
56             sumc[j]=0;
57             for(ll i=1;i<=n;++i)
58             {
59                 sumc[j]+=sum[i][j];
60             }
61         }
62         ll res=ans;
63         for(ll i=1;i<=n;++i)
64         {
65             for(ll j=1;j<=k;++j)
66             {
67                 res=min(res,ans-sumr[i]-sumc[j]+sum[i][j]);
68             }
69         }
70         cout<<res<<endl;
71     }
72     return 0;
73 }

猜你喜欢

转载自www.cnblogs.com/Zzqf/p/12007109.html