GalaxyOJ-792 (思维)

来源:互联网 发布:虚拟机无法桥接网络 编辑:程序博客网 时间:2024/06/06 10:45

题目

Problem Description

给你一个数列A[1..n],长度为n。
令f(l,r,k)为A[l..r]里的第k大的元素。
特别的,当r-l+1<k时,f(l,r,k)=0。
现在给你一个k,你需要求∑(l=1..n)∑(r=l..n)f(l,r,k)
即求f(1,1,k)+f(1,2,k)+…+f(1,n,k)+f(2,2,k)+f(2,3,k)+…+f(n,n,k)的和

Input

第一行输入两个整数n,k
第二行输入n个数,代表数列A[1..n],A[1..n]是一个1到n的全排列

对于50%的数据,n<=1000
对于100%的数据,n<=200000,k<=min(n,80)

Output

仅一行输出一个整数作为答案

Sample Input

1000 80 928 941 619 590 5 202 109 339 382 289 328 772 996 10 199 533 188 825 922 534 90 152 209 902 841 637 369 358 645 773 41 968 213 532 674 987 335 648 792 146 471 603 679 563 427 465 787 35 709 525 148 623 87 53 55 587 418 108 82 731 173 363 455 783 733 323 701 60 340 96 57 396 681 951 702 848 233 322 16 687 814 886 260 350 909 177 435 646 990 610 468 769 541 862 1000 156 359 956 317 864 208 945 609 934 791 395 790 754 812 901 932 380 506 520 649 577 830 85 910 978 370 527 162 718 511 957 839 284 43 811 311 686 761 962 656 760 421 354 882 818 30 280 931 691 573 500 497 401 496 935 100 642 967 473 404 740 798 788 49 918 224 381 713 944 911 870 599 690 666 930 840 880 638 472 368 479 753 121 664 376 866 942 722 614 398 793 807 561 402 481 119 411 98 507 362 726 732 320 970 804 77 116 301 736 276 356 917 794 446 80 244 989 237 228 565 176 478 106 530 47 756 182 447 591 270 975 313 556 234 166 770 711 775 859 143 739 797 429 79 682 12 823 154 815 927 580 157 853 131 897 181 436 759 214 617 954 437 268 608 26 122 74 693 971 710 133 434 390 164 868 236 385 459 602 9 432 817 484 557 457 779 981 451 552 526 747 433 316 735 997 529 766 118 420 287 654 367 343 330 195 460 410 337 655 583 225 615 50 891 963 365 810 651 306 560 264 294 384 252 387 275 698 939 107 319 265 878 135 493 40 855 827 72 545 307 200 789 206 510 683 355 854 550 392 819 786 170 11 834 890 125 685 628 514 305 721 105 463 795 621 37 452 480 334 251 123 538 75 982 394 449 568 17 719 203 842 147 327 92 845 720 486 169 441 245 680 285 83 219 572 657 985 183 59 607 542 33 613 936 888 523 419 112 174 689 218 745 491 134 103 659 405 254 185 650 212 277 625 282 885 291 908 95 717 513 914 495 3 62 6 286 575 31 48 894 925 799 180 242 632 537 406 588 539 515 283 501 559 555 728 94 302 38 149 198 158 274 415 616 22 210 91 522 238 4 89 622 847 120 763 423 342 630 412 372 204 946 986 844 831 439 601 15 861 776 403 246 29 130 749 66 780 115 581 594 595 730 298 63 547 159 865 332 700 464 912 474 1 425 851 585 235 863 145 444 597 620 139 517 470 377 487 611 101 705 258 546 23 828 51 612 110 256 551 562 564 966 509 952 499 400 20 558 849 516 652 76 977 193 741 259 357 114 813 25 893 207 879 947 336 802 883 247 860 958 999 102 329 503 73 32 743 430 374 117 366 485 826 165 290 641 490 820 262 984 86 266 310 647 269 843 938 391 279 658 639 631 482 454 549 965 738 871 36 141 498 54 582 586 703 408 768 596 980 216 34 344 352 163 201 748 111 593 52 808 295 716 898 314 128 948 129 665 144 69 136 488 388 972 566 521 161 677 600 138 178 578 431 919 988 97 458 567 153 393 347 469 943 293 338 781 462 64 453 299 46 806 869 58 993 124 466 494 68 889 461 765 544 226 995 569 273 518 653 194 127 142 2 13 757 598 916 961 714 742 341 667 715 937 528 215 353 668 896 675 874 574 172 333 489 829 708 875 187 196 850 892 953 508 809 744 624 723 771 397 241 261 887 475 192 456 778 19 881 707 346 229 14 858 450 27 852 132 543 28 933 186 99 175 959 915 907 232 45 729 636 222 315 71 983 752 899 750 44 409 929 737 88 895 243 292 857 257 281 784 417 383 440 774 70 661 253 155 312 540 724 519 179 231 800 309 684 137 905 428 126 872 271 78 994 7 371 250 877 211 197 762 973 758 920 167 876 662 373 39 160 512 168 785 386 699 838 976 940 900 846 592 379 633 955 414 248 502 669 678 992 189 536 93 300 272 805 671 991 746 796 477 171 278 579 695 190 24 974 445 65 318 230 442 706 263 42 348 979 331 694 492 727 571 676 399 960 824 140 924 725 816 220 255 426 836 349 751 360 304 764 904 688 964 604 913 531 926 822 296 483 605 407 629 240 998 589 777 223 949 151 221 324 104 505 837 921 249 424 835 570 351 634 81 18 584 205 923 467 422 113 504 378 670 239 535 767 361 635 712 903 906 803 345 663 606 548 696 308 969 884 576 150 297 626 643 227 697 21 554 8 833 692 673 640 389 61 627 325 553 821 321 644 267 734 67 416 524 375 856 618 191 476 448 217 950 413 867 704 288 782 326 755 84 364 438 873 672 184 801 303 832 56 443 660

Sample Output

293573175

分析

  • 对于 50% 的数据,用了个主席树过了,剩下 50%TLE……
  • 实际上可以考虑每个数可以被选几次
    • 假如数 A 左边和右边(前 k 个)比它大的数的位置都能求出来
    • 然后枚举左边选 j 个比 A 大的数,那么右边就是 (k-j-1) 个,左右都有一段区间可以选使得满足这个,那么这个情况下的区间就可以根据乘法原理求一下
    • 每个数都这样弄一次,时间复杂度是 O(n*k) ,是可行的。
  • 要求 l[][] 和 r[][] 的话,有个小技巧,选出数列中最小的元素,那么它左边都比它大,右边也都比它大,那么就能求出 l数组和 r数组,每次这样弄完一个元素后把它从数列中移除(可用双向链表实现),再弄最小的即可。
  • 由于数列是 1~n 的全排列,那么最小的数依次是 1~n ,记一下它们的位置然后就可以做了。

程序

#include <cstdio>int n,i,j,o,k,a[200005],f[200005],l[200005],r[200005],L[200005][100],R[200005][100];long long ans;int main(){    scanf("%d%d",&n,&k);    for (i=1; i<=n; i++) scanf("%d",&a[i]),f[a[i]]=i,l[i]=i-1,r[i]=i+1;    r[n+1]=n+1;    for (i=1; i<=n; i++){        for (o=0,j=f[i]; o<=k; o++,j=l[j]) L[i][o]=j;        for (o=0,j=f[i]; o<=k; o++,j=r[j]) R[i][o]=j;        l[r[f[i]]]=l[f[i]],r[l[f[i]]]=r[f[i]];    }    for (i=1; i<=n; i++)        for (j=0; j<k; j++) if (R[i][k-j-1]<=n){            ans+=(long long)i*(L[i][j]-L[i][j+1])*(R[i][k-j]-R[i][k-j-1]);        }    printf("%lld",ans);}

提示

  • 全开 long long 会爆空间,但用 int 在 ans+ 的时候会溢出,所以强转一下
  • r[n+1]=n+1 为了使 L[] 在后边全是一样的,免得后面 (R[i][k-j]-R[i][k-j-1]) 出现小于 0 的情况